почему эти тесты регулярных выражений пропускают определенные символы? - PullRequest
0 голосов
/ 21 декабря 2009

Я проверяю строку со следующими регулярными выражениями:

[a-zA-Z0-9]+
[A-Za-z]+

Почему-то символы:

.
-
_

разрешено проходить, почему это так?

Ответы [ 2 ]

18 голосов
/ 21 декабря 2009

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

^[a-zA-Z0-9]+$

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

Для пояснения: если вы просто используете [a-zA-Z0-9]+ в качестве регулярного выражения, то механизм регулярного выражения по праву отклонит строку -__--, поскольку регулярное выражение не соответствует этому. В определенном вами классе символов нет ни одного символа.

Однако со строкой a-b все по-другому. Механизм регулярных выражений будет соответствовать первому a здесь, так как он соответствует введенному вами выражению (хотя бы одному из заданных символов) и не будет заботиться о - или b. Он выполнил свою работу и успешно сопоставил подстроку в соответствии с вашим регулярным выражением.

Аналогично _-abcdef- - регулярное выражение будет точно соответствовать подстроке abcdef, потому что вы не указали, что она совпадает только в начале или конце строки; и игнорировать другие символы.

Таким образом, при использовании ^[a-zA-Z0-9]+$ в качестве регулярного выражения вы точно указываете механизму регулярных выражений, что ищете одну или несколько букв или цифр, начиная с самого начала строки вплоть до конца строки. Нет места для других персонажей, чтобы втиснуться или спрятаться, так что это будет делать то, что вы, очевидно, хотите. Но без привязок совпадение может быть в любом месте в строке поиска. В целях проверки вы всегда хотите использовать эти якоря.

0 голосов
/ 21 декабря 2009

В регулярных выражениях + указывает движку на совпадение с одним или несколькими символами.

Таким образом, это выражение [A-Za-z] + проходит, если строка содержит последовательность из 1 или более буквенных символов. Единственные строки, которые не проходят, - это строки, которые вообще не содержат буквенных символов.

Символ ^ привязывает класс символов к началу строки, а символ $ - к концу строки.

То есть ^ [A-Za-z0-9] + означает «соответствует строке, которая начинается с последовательности из одного или нескольких буквенно-цифровых символов». Но разрешает строки, содержащие не алфавитно-цифровые символы, если эти символы не находятся в начале строки.

Хотя ^ [A-Za-z0-9] + $ означает «соответствует строке, которая начинается и заканчивается последовательностью из одного или нескольких буквенно-цифровых символов». Это единственный способ полностью исключить не буквенно-цифровые символы из строки.

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