Какой лучший способ сопоставить только буквы в Regex?
Вопрос
Я бы очень хотел использовать W, но он также соответствует подчеркиванию, поэтому я иду с [A-ZA-Z], который чувствует себя без необходимости влагосвященной и Америке. Есть лучший способ сделать это? Что-то вроде [ W ^ _] (я сомневаюсь, что получил этот синтаксис справа)?
Решение
Вы могли бы использовать /[a-z]/i
или /[[:alpha:]]/
точно также. Фактически, \w
Включает в себя номера, так что даже не будет работать.
Другие советы
Возможно, вы имеете в виду /[[:alpha:]]/
? Видеть перлр Для обсуждения классов символов POSIX.
Просто использовать \p{L}
что означает «любое письмо Unicode» и работает в Perl (/\p{L}/
). Вам, вероятно, надо use utf8;
.
Соответствующие международный (т.е. не-ASCII) символы довольно жесткие, и могут зависеть от многих вещей. Проверьте этот пример:
#!perl -w
use strict;
use utf8;
my $string = "ä";
print "matched :alpha:\n" if $string =~ /[[:alpha:]]/;
print "matched ^\\W0-9_\n" if $string =~ /[^\W0-9_]/;
print "matched [a-zA-Z]\n" if $string =~ /[a-zA-Z]/;
print "matched [a-z]i\n" if $string =~ /[a-z]/i;
print "matched [A-z]\n" if $string =~ /[A-z]/;
Для меня это приводит к
matched :alpha:
Если вы удалите use utf8
Тогда ни одно из регулярных выражений совпадает.
Смотря на Этот очень актуальный вопрос, Похоже, вы, вероятно, хотите use utf8
и проверить Unicode :: семантика.
Конечно, если вы используете прямые символы ASCII, чем у любого из вышеупомянутых регулярных выражений.
[^\W0-9_]
# or
[[:alpha:]]
Смотреть Perldoc. перлр
Несколько вариантов:
1. /[a-z]/i # case insensitive
2. /[A-Z]/i # case insensitive
3. /[A-z]/ # explicit range listing (capital 'A' to lowercase 'z')
4. /[[:alpha:]]/ # POSIX alpha character class
Я рекомендую использовать либо в случае безчувствительности, либо истинным способом /[a-zA-z]/
, если у вас есть определенные языковые предпочтения в виду.
Примечание:
- Номер 3 требует столицы «A», а затем строчные буквы «Z» из-за порядка значений ASCII; Это не работает, если вы сделаете обратное:
a-Z
. Отказ Также: Этот метод не пройдет критерии NO-подчеркивания, поскольку он включает в себя [ \ ] ^ _ ` . - Номер 4 будет соответствовать этим дополнительным языковым символам, но он также соответствует:
ʹʺʻˍˎˏːˑˬˮ̀́
(плюс много других)
Вы ищете интернационализацию в вашем Regex? Тогда вам нужно сделать что-то вроде этого парня: Проблема проверки JavaScript с международными персонажами
Явно соответствует всем языкам Луны :)