Regex відповідає лише літерам


374

Як я можу написати регулярний вираз, який відповідає лише літерам?


58
Яке ваше визначення characters? ASCII? Канджі? Ізо-XXXX-X? UTF8?
Іво Ветцель

45
Яке ваше визначення regex? Perl? Emacs? Греп?
Паскаль Куок

4
Зважаючи на те, що питання англійською мовою, на веб-сайті англійською мовою, справедливо вважати, що питання стосується символів англійською мовою.
vaer-k

1
Я помітив, що \ p {L} для букви та / u для Unicode відповідає будь-якій букві мого /\p{L}+/u
регексу,

4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. Це правда. Як ми всі знаємо, англійські, які говорять НІКОЛИ не локалізують свої програми!
Олексій

Відповіді:


392

Використовуйте набір символів: [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: Він скоріше розбивається на мови, використовуючи символи, які не є латинськими.
Gumbo

15
Вже перерви на 90% німецького тексту, навіть не згадуйте французьку чи іспанську. Італійський все ще може зробити дуже добре, хоча.
Іво Ветцель

9
це залежить від того, яке визначення "латинського символу" ви виберете. J, U, Ö, Ä можна вважати латинськими символами чи ні, виходячи з вашого визначення. Але всі вони використовуються мовами, які використовують «латинський алфавіт» для письма.
Іоахім Зауер

9
\ p {L} відповідає всім акцентам седули umlauts тощо, тому вам слід поступити з цим.
Раду Сіміонеску

198

\p{L} відповідає усьому, що є буквою Unicode, якщо вас цікавлять алфавіти, що виходять за межі латинського


2
не у всіх ароматах регексу. Наприклад, regexes vim трактується \pяк "Друкований символ".
Філіп Поттер

3
Ця сторінка пропонує лише підтримку виразів java, .net, perl, jgsoft, XML та XPath \ p {L}. Але основні недоліки: python та ruby ​​(хоча у python є модуль регулярного виразів).
Філіп Поттер

6
@Philip Potter: Ruby підтримує властивості символів Unicode, використовуючи той самий синтаксис.
Йорг W Міттаг

6
Я думаю, що це має \p{L}\p{M}*+стосуватися листів, що складаються з декількох точок коду, наприклад, лист із наступними позначками наголосу. Відповідно з regular-expressions.info/unicode.html
ZoFreX

з python 3 це призводить до помилкиbad escape \p at position 0
matanster

46

Залежно від вашого значення "персонаж":

[A-Za-z]- усі літери (великі та малі)

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


Я мав на увазі літери. Це, здається, не працює. 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]+

як пропонують інші користувачі


1
Хоча не відповідає жодним спеціальним символам.
Nyerguds

20

Ви б використали

/[a-z]/gi

[] - перевіряє наявність будь-яких символів між заданими входами

az --- охоплює весь алфавіт

g ----- в усьому світі протягом усього рядка

i ----- отримання верхнього та нижнього регістру


14

Регулярний вираз, який мало хто написав як "/ ^ [a-zA-Z] $ / i", не є правильним, оскільки, нарешті, вони згадали / i, що є нечутливим до випадку і після першого збігу воно повернеться назад. Замість / я просто використовую / g, що є глобальним, і вам також не потрібно ставити ^ $ для початку та кінця.

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




7

Використовуйте групи символів

\D

Відповідає будь-якому символу, крім цифр 0-9

^\D+$

Дивіться приклад тут


8
Це також буде відповідати пробілу, символам тощо, що, здається, не те, про що задається питання.
DaveMongoose

Дивно. Щойно я отримав рішення про це, і це не я!
Дейв Еверітт

6

Просто використовуйте \wабо [:alpha:]. Це послідовність втечі, яка відповідає лише символам, які можуть відображатися словами.


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].


Це не те, що [^\W|\d]означає
OGHaza

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|]- все з яких прирівнюють до є буквений символ, не є оператором АБО. Оператор АБО має на увазі між кожним символом класу символів, вводячи фактичний засіб, за яким ви хочете, щоб клас прийняв ("трубу") символ. ([a]|[b]|[c]|[d]|[|])|||
OGHaza

1

Останнім часом я використовував цей зразок у своїх формах, щоб перевірити імена людей, що містять літери, пробіли та спеціальні символи, такі як наголоси.

pattern="[A-zÀ-ú\s]+"

Ви повинні подивитися на таблицю ASCII. A-zвідповідає більше, ніж просто листи, а такожÀ-ú
Toto

0

візерунок = / [a-zA-Z] /

ставить "[a-zA-Z]: # {pattern.match (" мій цвіт ")}" Добре

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

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

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

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


3
А як, наприклад, "Zażółć gęslą jaźń"?
Свідок

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.