Является ли регулярное выражение [a-Z] допустимым и если да, то совпадает ли оно с [a-zA-Z]? - PullRequest
13 голосов
/ 02 ноября 2009

Допустимо ли регулярное выражение [a-Z] и если да, то совпадает ли оно с [a-zA-Z]? Обратите внимание, что в [a-Z] a строчные, а Z прописные.

Edit:

Я получил несколько ответов, в которых указывалось, что хотя [a-Z] недопустимо, тогда [A-z] допустимо (но не будет совпадать с [a-zA-Z]), и это действительно то, что я искал. Так как я хотел узнать, можно ли вообще заменить [a-zA-Z] на более компактную версию.

Спасибо всем, кто внес свой вклад в ответ.

Ответы [ 7 ]

34 голосов
/ 02 ноября 2009

Нет, a (97) больше, чем Z (90). [a-Z] не является допустимым классом символов. Однако [A-z] тоже не будет эквивалентен, но по другой причине. Он будет охватывать все буквы, но также будет включать символы между заглавными и строчными буквами: [\]^_`.

4 голосов
/ 02 ноября 2009

Я не уверен насчет реализации других языков, но в PHP вы можете сделать

"/[a-z]/i"

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

3 голосов
/ 02 ноября 2009

Вы не указываете, какой язык, но в целом [a-Z] не будет допустимым диапазоном, так как в ASCII буквенные символы нижнего регистра идут после символов верхнего регистра. [A-z] может быть допустимым диапазоном (с указанием всех альфа в верхнем и нижнем регистре, а также пунктуации между Z и a), но это может быть не так, в зависимости от вашего конкретная реализация. Флаг i может быть добавлен к регулярному выражению, чтобы сделать его без учета регистра; проверьте вашу конкретную реализацию для инструкций о том, как указать этот флаг.

2 голосов
/ 02 ноября 2009

Если он действителен, он не будет делать то, что вы ожидаете.

Код символа Z ниже, чем код символа a, поэтому, если коды поменялись местами для обозначения диапазона [Z-a], он будет таким же, как [Z\[\\\]^_`a], то есть он будет включать символы Z и a и символы между ними.

Если вы используете [A-z], чтобы получить все прописные и строчные буквы, это не то же самое, что [A-Za-z], это то же самое, что и [A-Z\[\\\]^_`a-z].

2 голосов
/ 02 ноября 2009

Вы всегда можете попробовать это:

 print "ok" if "monkey" =~ /[a-Z]/;

Perl говорит

Invalid [] range "a-Z" in regex; marked by <-- HERE in m/[a-Z <-- HERE ]/ at a-z.pl line 4.
1 голос
/ 17 октября 2012

Я только что упал в сценарии (не в моем собственном).

Похоже, что grep, awk, sed принимают [a-Z] в зависимости от вашей локали (то есть переменная окружения LANG или LC_CTYPE). В POSIX [a-Z] не разрешен этими инструментами, но в некоторых других локалях (например, en_gb.utf8) он работает и такой же, как [a-zA-Z].

Да, я проверил, не соответствует ни одному из _^[]`.

Учитывая, что на отладку ушло довольно много времени, я настоятельно не рекомендую никому использовать [a-Z] в регулярных выражениях.

1 голос
/ 02 ноября 2009

Нет, это недопустимо, возможно, потому что значения ASCII не являются последовательными от z до A.

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