Mysql RLIKE - соответствует конец строки или другой символ

Я пытаюсь использовать RLIKE, чтобы соответствовать, где за строкой данных следует либо определенный символ, либо конец строки ($). Я получаю ожидаемые результаты, используя только конец строкового символа ($), или только ожидаемый символ, или любой другой набор ожидаемых символов в квадратных скобках, но как только я ухожу в квадратные скобки для ожидаемого символа ИЛИ и конца символ строки, конец строки не соответствует.

Вот пример:

Данные SQL:

CREATE TABLE test_table (id int auto_increment primary key, search_string varchar(8));
INSERT INTO test_table (search_string) VALUES("123456789");
INSERT INTO test_table (search_string) VALUES("1234567");
INSERT INTO test_table (search_string) VALUES("123456");
INSERT INTO test_table (search_string) VALUES("12345");
INSERT INTO test_table (search_string) VALUES("12345E");

Примеры запросов по этим данным:

SELECT count(*) FROM test_table WHERE search_string RLIKE "56[7]";
# the above returns fine - 2 rows (first and second)

SELECT count(*) FROM test_table WHERE search_string RLIKE "56[7YE]";
# the above returns fine - 2 rows (rows 2 and 5) as expected

SELECT count(*) FROM test_table WHERE search_String RLIKE "56$";
# the above returns fine - 1 rows (the third) as expected as 6 is followed by end of string

SELECT count(*) FROM test_table WHERE search_string RLIKE "56[7$]";
# the above returns only 1 row and should be 2 (rows 2 and 3 - '56' should be followed by a 7 or end of string)

Есть ли особый способ обработки символа $ в квадратных скобках?

2 ответа

Решение

Регулярное выражение может просто нуждаться в небольшой настройке. Вместо 56[7$] вместо этого вы должны использовать один из следующих

56($|7)  
56($|[7YE])

В пределах [] $ пытается соответствовать буквальному знаку доллара. Вместо этого вы ищете $, чтобы соответствовать концу строки, и поэтому он не может быть в квадратных скобках.

Это сработало, когда я попробовал его на основе ваших тестовых данных:

SELECT COUNT(*) FROM test_table WHERE search_string RLIKE '567{0,1}$'

Я старался 56($|7) и он получил строки 2 и 3, но он также получил строку 1

[Редактировать: {0,1} (одно или несколько совпадений) представляет собой особый случай, представленный ?таким образом, выражение также может быть 567?$.]

Другие вопросы по тегам