Mysql регулярное выражение не удается - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь найти какие-либо записи в таблице клиентов, где имя не содержит букв. Вот что я использую. При запуске не возвращает никаких найденных записей. Кто-нибудь укажет на мою ошибку, пожалуйста?

    table customers {
    name = Еarnings on thе Intеrnet from
    }

    SELECT name from customers WHERE name NOT REGEXP '[a-zA-Z]' ; 

1 Ответ

2 голосов
/ 07 апреля 2020

Если я сравниваю строку, используя REGEXP '[a-zA-Z]', она совпадает, если любой символ в строке соответствует букве в этом регулярном выражении. Строка, которую вы показываете, содержит буквы типа a, r, n, i, g, s. Любого из них достаточно, чтобы удовлетворить сравнение с REGEXP.

mysql> select 'Еarnings on thе Intеrnet from' REGEXP '[a-zA-Z]' as ok;
+----+
| ok |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

Отрицание NOT REGEXP совпадает с NOT (expr REGEXP pattern). Он просто меняет результат 1 на 0 или 0 на 1.

mysql> select 'Еarnings on thе Intеrnet from' NOT REGEXP '[a-zA-Z]' as ok;
+----+
| ok |
+----+
|  0 |
+----+

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

mysql> select 'Еarnings on thе Intеrnet from' REGEXP '[^a-zA-Z]' as ok;
+----+
| ok |
+----+
|  1 |
+----+

Символы Ð • µ не находятся в диапазоне [a-zA-Z] и путь к express дополнительному диапазону символов заключается в использовании [^a-zA-Z]. То есть с символом ^ в квадратных скобках символ будет соответствовать, если он НЕ является одним из символов в этом диапазоне.

См. Также https://dev.mysql.com/doc/refman/8.0/en/regexp.html#regexp -синтаксис в разделе пункт:

  • [a-dX], [^ a-dX]

Ваш комментарий:

Я проверил проверку на наличие указанных вами символов, включая пробел, апостроф, точку и da sh:

mysql> select 'Mr. Tim O''Toole' regexp '[^a-zA-Z \'.-]' as ok;
+----+
| ok |
+----+
|  0 |
+----+

mysql> select 'Mr. Tim $ O''Toole' regexp '[^a-zA-Z \'.-]' as ok;
+----+
| ok |
+----+
|  1 |
+----+

Вам не нужно ставить бэкслу sh перед - , но это должно быть обработано специально:

Чтобы включить буквальный символ, он должен быть написан первым или последним.

Это в документации, которую я связал к.

...