Каков наилучший способ сопоставить только буквы в регулярном выражении? - PullRequest
13 голосов
/ 20 сентября 2010

Я бы очень хотел использовать \ w, но он также соответствует подчеркиванию, поэтому я использую [A-Za-z], который кажется излишне многословным и ориентированным на Америку. Есть лучший способ сделать это? Что-то вроде [\ w ^ _] (я сомневаюсь, что я правильно понял этот синтаксис)?

Ответы [ 7 ]

15 голосов
/ 20 сентября 2010

Возможно, вы имеете в виду /[[:alpha:]]/? См. perlre для обсуждения классов символов POSIX.

11 голосов
/ 20 сентября 2010

Просто используйте \p{L}, что означает «любая буква Юникода» и работает на Perl (/\p{L}/).Вам, вероятно, нужно use utf8;.

8 голосов
/ 20 сентября 2010

Сопоставление международных (т.е. не 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 :: Semantics .

Конечно, если вы используете прямые символы ASCII, то подойдет любое из вышеупомянутых регулярных выражений.

8 голосов
/ 20 сентября 2010

Вы также можете использовать /[a-z]/i или /[[:alpha:]]/.На самом деле, \w включает числа, которые даже не будут работать.

6 голосов
/ 20 сентября 2010
[^\W0-9_]

# or

[[:alpha:]]

См. Perldoc perlre

4 голосов
/ 20 сентября 2010

Несколько вариантов:

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 требует заглавной буквы «А», а затем строчной буквы «z» из-за порядка значений ASCII;это не работает, если вы делаете обратное: a-Z.Кроме того: этот метод не соответствует критериям без подчеркивания, поскольку он включает [\] ^ _ `.
  • Число 4 будет соответствовать этим дополнительным языковым символам,но это также соответствует:
    ʹʺʻˍˎˏːˑˬˮ̀́ (плюс многие другие)
1 голос
/ 20 сентября 2010

вы ищете интернационализацию в своем регулярном выражении?тогда вам нужно будет сделать что-то похожее на это:

...