Регулярное выражение, чтобы соответствовать только буквы

376

Как я могу написать регулярное выражение, которое соответствует только буквы?

Nike
источник
58
Какое у вас определение characters? ASCII? Кандзи? Iso-XXXX-X? UTF8?
Иво Ветцель
45
Какое у вас определение regex? Perl? Emacs? Grep?
Паскаль Куок
4
Учитывая, что вопрос на английском языке, на английском сайте, будет справедливо предположить, что вопрос касается символов на английском языке.
vaer-k
1
Я заметил, что \ p {L} для буквы и / u флаг для Unicode соответствует любой букве в моем регулярном выражении, т.е./\p{L}+/u
MaxZoom
4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. Это правда. Как мы все знаем, носители английского НИКОГДА не локализуют свои приложения!
Алекс

Ответы:

393

Используйте набор символов: [a-zA-Z]соответствует одной букве от A до Z в нижнем и верхнем регистре. [a-zA-Z]+соответствует одной или нескольким буквам и ^[a-zA-Z]+$соответствует только строкам, которые состоят только из одной или нескольких букв ( ^и $отмечают начало и конец строки соответственно).

Если вы хотите , чтобы соответствовать другим , чем буквы A-Z, вы можете добавить их к набору символов: [a-zA-ZäöüßÄÖÜ]. Или вы используете предопределенные классы символов, такие как класс свойств символов Unicode,\p{L} который описывает символы Unicode, которые являются буквами.

гумбо
источник
119
Это очень ASCII-ориентированное решение. Это сломает практически любой неанглоязычный текст.
Йоахим Зауэр
7
@Joachim Sauer: Это скорее сломает языки, использующие нелатинские символы.
Гамбо
15
Уже разбивает 90% немецкого текста, даже не упоминает французский или испанский. Итальянский может все еще очень хорошо, хотя.
Иво Ветцель
9
это зависит от того, какое определение «латинского символа» вы выберете. J, U, Ö, Ä можно утверждать, что это латинские символы или нет, в зависимости от вашего определения. Но все они используются в языках, которые используют «латинский алфавит» для письма.
Йоахим Зауэр
9
\ p {L} соответствует всем акцентам седла умлаутов и т. д., так что вы должны пойти с этим.
Раду Симионеску
198

\p{L} соответствует любому, что является буквой Unicode, если вы заинтересованы в алфавитах помимо латинского

RobV
источник
2
не во всех вкусах регулярных выражений. Например, регулярные выражения vim рассматриваются \pкак «печатные символы».
Филипп Поттер
3
на этой странице предлагается поддержка только регулярных выражений java, .net, perl, jgsoft, XML и XPath \ p {L}. Но основные упущения: python и ruby ​​(хотя в python есть модуль regex).
Филипп Поттер
6
@Philip Potter: Ruby поддерживает свойства символов Unicode, используя тот же синтаксис.
Йорг Миттаг
6
Я думаю, что это должно \p{L}\p{M}*+охватывать буквы, состоящие из нескольких кодовых точек, например буквы, за которыми следуют знаки ударения. Согласно регулярным
выражениям.info
с питоном 3 это выдает ошибкуbad escape \p at position 0
matanster
46

В зависимости от вашего значения «характер»:

[A-Za-z]- все буквы (прописные и строчные)

[^0-9] - все нецифровые символы

KristofMols
источник
Я имел в виду буквы. Похоже, это не работает. preg_match ('/ [a-zA-Z] + /', $ name);
Nike
[A-Za-z] - это просто объявление символов, которые вы можете использовать. Вам все еще нужно указать, сколько раз нужно использовать это объявление: [A-Za-z] {1,2} (для соответствия 1 или 2 буквам) или [A-Za-z] {1, *} (для соответствия 1 или более букв)
KristofMols
17
ну, а, б, б, Ö, Ä ... тоже буквы, и অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ א, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv
@phuclv: Действительно, но это зависит от кодировки, и кодировка является частью настроек программы (либо конфигурации по умолчанию, либо конфигурации, объявленной в файле конфигурации программы). Когда я работал на разных языках, я обычно сохранял это в константе, в файле конфигурации.
Каталина Чирку
1
Кодировка @CatalinaChircu здесь абсолютно неактуальна. Кодирование - это способ кодировать кодовую точку в двоичном наборе символов, например, UTF-8 - это кодировка для Unicode. Письма OTOH зависят от языка, и если кто-то говорит, что [A-Za-z]это буквы, то необходимо указать используемый язык
phuclv
32

Ближайший доступный вариант

[\u\l]+

которая соответствует последовательности прописных и строчных букв. Тем не менее, он поддерживается не всеми редакторами / языками, поэтому его, вероятно, безопаснее использовать

[a-zA-Z]+

как предлагают другие пользователи

blue_note
источник
1
Не будет соответствовать каким-либо специальным символам.
Нергудс
20

Вы бы использовали

/[a-z]/gi

[] - проверяет наличие любых символов между заданными входами

аз --- охватывает весь алфавит

г ----- глобально на протяжении всей строки

я ----- получаю прописные и строчные буквы

Скотт
источник
14

Регулярное выражение, которое немногие люди написали как «/ ^ [a-zA-Z] $ / i», неверно, потому что в последнем случае они упомянули / i, что не учитывает регистр, и после сопоставления в первый раз оно вернется обратно. Вместо / я просто использую / g, который предназначен для глобального, и вам также не нужно ставить ^ $ для начала и окончания.

/[a-zA-Z]+/g
  1. [a-z _] + соответствует одному символу, представленному в списке ниже
  2. Квантификатор: + От одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости
  3. az один символ в диапазоне между a и z (чувствителен к регистру)
  4. AZ один символ в диапазоне между A и Z (с учетом регистра)
  5. Модификатор g : глобальный. Все матчи (не возвращаются в первом матче)
Йогеш Чаухан
источник
13

Ява:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}
Udeshika Sewwandi
источник
4
это не включает диакритические знаки, такие какŹŻŚĄ
karoluS
11

Для PHP следующее будет работать нормально

'/^[a-zA-Z]+$/'
Рохит Дубей
источник
7

Используйте группы персонажей

\D

Соответствует любому символу, кроме цифр 0-9

^\D+$

Смотрите пример здесь

Томаш Неделька
источник
8
Это также будет соответствовать пробелам, символам и т. Д., Что, по-видимому, не соответствует задаче.
Дейв Мангуст
Weird. Просто понизил это, и это не я!
Дейв Эверитт,
6

Просто используйте \wили [:alpha:]. Это escape-последовательности, которые соответствуют только символам, которые могут появляться в словах.

Agaspher
источник
9
\wне может быть хорошим решением во всех случаях. По крайней мере, в PCRE, \wможет соответствовать другим персонажам. Цитируя руководство по PHP : « слово» - это любая буква или цифра или символ подчеркивания, то есть любой символ, который может быть частью «слова» Perl. Определение букв и цифр контролируется таблицами символов PCRE, и может отличаться, если имеет место специфичное для локали сопоставление. Например, в локали "fr" (французский) некоторые коды символов, превышающие 128, используются для букв с ударением, и они совпадают с \ w. ".
Амаль Мурали
слова включают в себя другие символы из букв
V-SHY
2
\wозначает совпадение букв и цифр
Евгений Коньков
4

Если вы имеете в виду любые буквы в любой кодировке символов, то хорошим подходом может быть удаление не букв, таких как пробелы \s, цифры \dи другие специальные символы, такие как:

[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]

Или используйте отрицание вышеупомянутого отрицания, чтобы напрямую описать любые буквы:

\S \D and [^  ..special chars..]

Плюсы:

  • Работает со всеми вкусами регулярных выражений.
  • Легко написать, иногда сэкономить много времени.

Минусы:

  • Длинный, иногда не идеальный, но кодировка символов также может быть нарушена.
Славомир Ленарт
источник
4

Вы можете попробовать это регулярное выражение: [^\W\d_]или [a-zA-Z].

Motlab
источник
Это не [^\W|\d]значит, что
О.Г.Газа
1
[^\W|\d]значит нет \Wи нет |и нет \d. Он имеет тот же чистый эффект, поскольку |является частью, \Wно |не работает так, как вы думаете. Даже тогда это означает, что он принимает _характер. Вы, вероятно, ищете[^\W\d_]
OGHaza
Я согласен с вами, он принимает _. Но «НЕ» |равно «И», поэтому [^\W|\d]означает: «НЕ \W И НЕ»\d
Motlab
12
[^ab]значит нет aи нет b. [^a|b]значит неa и нет |и нет b. Чтобы дать второй пример [a|b|c|d]точно так же , как и [abcd|||]который является точно такой же , как [abcd|]- все из которых приравнивают к является буквенный символ, не является оператором ИЛИ. Оператор OR подразумевается между каждым символом в классе символов, что означает, что вы хотите, чтобы класс принял символ (pipe). ([a]|[b]|[c]|[d]|[|])|||
О.Г.Газа
1

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

pattern="[A-zÀ-ú\s]+"
camilablnpa
источник
Вы должны взглянуть на таблицу ASCII. A-zсоответствует больше, чем просто буквы, а такжеÀ-ú
Тото
0

pattern = / [a-zA-Z] /

ставит "[a-zA-Z]: # {pattern.match (" mine flower ")}" OK

ставит "[a-zA-Z]: # {pattern.match (" 456 ")}"

ставит "[a-zA-Z]: # {pattern.match (" ")}"

ставит "[a-zA-Z]: # {pattern.match (" # $% ^ & * ")}"

ставит "[a-zA-Z]: # {pattern.match (" # $% ^ & * A ")}" ОК

Снм Маурья
источник
3
А что, например, «Zażółć gęslą jaźń»?
Свидетель
-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

if (pattern.matcher("a").find()) {

   ...do something ......
}
Фикреселам Элала
источник