регулярное выражение не работает правильно, когда тест в порядке - PullRequest
0 голосов
/ 21 января 2019

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

Вот мое регулярное выражение, которое я проверял на https://www.regexpal.com

([^A-Z+|a-z+].*)

Я проверял его на многочисленных вариацияхтакие как SC08093, ZC000191 и NI232312, которые не должны совпадать и не совпадать в тестах, и это нормально.

Мой SQL-запрос выглядит так:

SELECT companyNumber FROM company_data 
WHERE companyNumber ~ '([^A-Z+|a-z+].*)' order by companyNumber desc

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

Я прочитал документацию для postgres, но, похоже, ничего не нашел по этому поводу.Я не уверен, что мне здесь не хватает.Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

~ '([^A-Z+|a-z+].*)' не работает, потому что это операция сопоставления с регулярным выражением [^A-Z+|a-z+].*, которая возвращает истину даже при частичном сопоставлении (операция сопоставления с регулярным выражением не требует полного сопоставления строк, поэтому шаблон может совпадать в любом месте строки). [^A-Z+|a-z+].* соответствует букве от A до Z, +, | or a letter from a to z`, а затем любому количеству любых нулей или более символов в любом месте строки.

Вы можете использовать

WHERE companyNumber NOT SIMILAR TO '[A-Za-z]{2}%'

См. онлайн демо

Здесь NOT SIMILAR TO возвращает обратный результат операции SIMILAR TO. Этот оператор SIMILAR TO принимает шаблоны, которые являются почти регулярными шаблонами, но также похожи на обычные шаблоны. NOT SIMILAR TO '[A-Za-z]{2}%' означает, что все записи, начинающиеся с двух букв ASCII ([A-Za-z]{2}) и имеющие что-либо после (%), НЕ возвращаются, а все остальные возвращаются. Обратите внимание, что SIMILAR TO требует полного совпадения строк, так же как LIKE.

0 голосов
/ 21 января 2019

Ваш шаблон: [^A-Z+|a-z+].* означает «строку, где по крайней мере некоторые символы не являются AZ» - чтобы распространить ее на всю строку, вам потребуется использовать привязанное регулярное выражение, как показано S-Man (группа, определенная с помощью (..) на самом деле не нужно)

Я бы, вероятно, использовал бы регулярное выражение, которое указывает, нужен ли допустимый шаблон, а затем использовал бы !~.

where company !~ '^[0-9].*$'

^[0-9].*$ означает "состоит только из цифр ", а !~ означает" не совпадает "

или

where not (company ~ '^[0-9].*$')
0 голосов
/ 21 января 2019

Не начинать с буквы можно с помощью

WHERE company ~ '^[^A-Za-z].*'

demo: db <> fiddle

Первый ^ отмечает начало.[^A-Za-z] говорит: «без букв» (включая строчные и заглавные буквы).


Редактировать: Изменено [A-z] на более точное [A-Za-z] ( Почемуэто регулярное выражение разрешает использование каретки? )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...