Задать вопрос
CityCat4
@CityCat4
Жил да был черный кот за углом...

Почему один регэксп работает, а второй нет?

Вопрос исключительно академического значения - мне, как упоротому перфекционисту, хочется знать почему...

> echo Test.1-2_3 | grep -E -e "^[A-Za-z0-9_\-\.]+$"
(в выводе ничего нет)
Press any key to continue...

> echo Test.1-2_3 | grep -E -e "^[A-Za-z0-9_\.\-]+$"
Test.1-2_3
Press any key to continue...

Регэкспы отличаются двумя последними символами - в "неправильном" \-\. в "правильном" \.\-

Почему так? Я что-то не учел?
  • Вопрос задан
  • 199 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
ЕМНИП, в basic и extended режимах внутри квадратных скобок символы не эскейпятся и бэкслэш рассматривается как обычный символ. В первом случае получаем интервал от бэкслэша до бэкслэша (то есть, бэкслэш) и точку. Во втором - бэкслэш (дважды), точку и тире.
Эскейпятся только в PCRE (ключ -P).
Ответ написан
Комментировать
ipatiev
@ipatiev
Потомок старинного рода Ипатьевых-Колотитьевых
1. Выясняем, какой у нас движок. POSIX ERE
2. Идём в спецификацию
3. Читаем: When the bracket expression appears within an ERE, the special characters '.', '(', '*', '+', '?', '{', '|', '$', '[', and '\\' shall lose their special meaning within the bracket expression;

То есть \-\ читается "от \ до \" и вместо дефиса мы ищем слеш.

Вывод: Все эти палочки не нужны, достаточно написать echo Test.1-2_3 | grep -E -e ^[A-Za-z0-9_.-]+$
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
ky0
@ky0
Миллиардер, филантроп, патологический лгун
В первом случае, насколько я понял, оно воспринимает последние символы как range между подчёркиванием и точкой. Если тире поставить в конце - то его можно не экранировать.

^[A-Za-z0-9_\.-]+$
Ответ написан
hint000
@hint000
у админа три руки
Гугл отвечает:
Обзор от ИИ
Within a regular expression character class [], the hyphen - has a special meaning when it is placed between two other characters, where it denotes a range of characters (e.g., [a-z] matches any lowercase letter from 'a' to 'z').
However, if the hyphen is positioned as the very first or very last character within the square brackets, it loses its special "range" meaning and is treated as a literal hyphen character.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы