Regex, aby dopasować tylko litery

374

Jak napisać wyrażenie regularne, które pasuje tylko do liter?

Nike
źródło
58
Jaka jest twoja definicja characters? ASCII? Kanji? ISO-XXXX-X? UTF8?
Ivo Wetzel
45
Jaka jest twoja definicja regex? Perl? Emacs? Grep?
Pascal Cuoq,
4
Biorąc pod uwagę, że pytanie jest w języku angielskim, na angielskiej stronie internetowej można założyć, że pytanie dotyczy znaków w języku angielskim.
vaer-k
1
Zauważyłem, że \ p {L} dla litery i flagi / u dla Unicode pasuje do dowolnej litery w moim wyrażeniu regularnym, tj./\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. To prawda. Jak wszyscy wiemy, anglojęzyczni NIGDY nie lokalizują swoich aplikacji!
Alex

Odpowiedzi:

392

Użyj zestawu znaków: [a-zA-Z]dopasowuje jedną literę od A – Z małymi i dużymi literami. [a-zA-Z]+dopasowuje jedną lub więcej liter i ^[a-zA-Z]+$dopasowuje tylko ciągi, które składają się z jednej lub więcej liter (^ i$ zaznaczają początek i koniec łańcucha).

Jeśli chcesz, aby dopasować inne litery niż-Z, można je dodać do zestawu znaków: [a-zA-ZäöüßÄÖÜ]. Lub używasz predefiniowanych klas znaków, takich jak klasa właściwości znaków Unicode,\p{L} która opisuje znaki Unicode, które są literami.

Gumbo
źródło
119
To bardzo skoncentrowane na ASCII rozwiązanie. Spowoduje to uszkodzenie praktycznie dowolnego tekstu w języku innym niż angielski.
Joachim Sauer
7
@Jachach Sauer: Będzie raczej łamał się na językach, używając znaków spoza alfabetu łacińskiego.
Gumbo,
15
Łama już 90% tekstu niemieckiego, nie wspominając nawet o francuskim czy hiszpańskim. Włoski może nadal dobrze sobie radzić.
Ivo Wetzel,
9
zależy to od tego, jaką definicję „charakteru łacińskiego” wybierzesz. J, U, Ö, Ę można argumentować, że są znakami łacińskimi lub nie, zgodnie z twoją definicją. Ale wszystkie są używane w językach, w których do pisania używany jest „alfabet łaciński”.
Joachim Sauer
9
\ p {L} pasuje do wszystkich akcentów umlautów sedilli itp., więc powinieneś to zrobić.
Radu Simionescu,
198

\p{L} dopasowuje wszystko, co jest literą Unicode, jeśli interesują Cię alfabety inne niż łacińskie

RobV
źródło
2
nie we wszystkich odmianach wyrażeń regularnych. Na przykład wyrażenia regularne vim traktują \pjako „znak do wydruku”.
Philip Potter
3
ta strona sugeruje tylko obsługę wyrażeń regularnych Java, .net, perl, jgsoft, XML i XPath \ p {L}. Ale najważniejsze pominięcia: python i ruby ​​(chociaż python ma moduł regex).
Philip Potter
6
@Pilil Potter: Ruby obsługuje właściwości znaków Unicode przy użyciu tej samej składni.
Jörg W Mittag
6
Myślę, że powinno to \p{L}\p{M}*+dotyczyć listów składających się z wielu współrzędnych kodowych, np. Litery poprzedzającej znaki akcentujące. Jak na regular-expressions.info/unicode.html
ZoFreX
z bad escape \p at position 0
pytonem
46

W zależności od znaczenia „postaci”:

[A-Za-z]- wszystkie litery (wielkie i małe)

[^0-9] - wszystkie znaki niecyfrowe

KristofMols
źródło
Miałem na myśli litery. Wygląda na to, że nie działa. preg_match ('/ [a-zA-Z] + /', $ name);
Nike
[A-Za-z] to tylko deklaracja znaków, których możesz użyć. Nadal musisz zadeklarować, ile razy należy użyć tej deklaracji: [A-Za-z] {1,2} (aby dopasować 1 lub 2 litery) lub [A-Za-z] {1, *} (aby dopasować 1 lub więcej liter)
KristofMols
17
no à, á, ã, Ö, Ę ... również są literami, podobnie jak অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ א, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv
@phuclv: Rzeczywiście, ale to zależy od kodowania, a kodowanie jest częścią ustawień programu (domyślna konfiguracja lub ta zadeklarowana w pliku konfiguracyjnym programu). Kiedy pracowałem nad różnymi językami, zapisywałem to na stałe w pliku konfiguracyjnym.
Catalina Chircu
1
Kodowanie @CatalinaChircu jest tutaj absolutnie nieistotne. Kodowanie to sposób na zakodowanie punktu kodowego w zestawie znaków w formacie binarnym, na przykład UTF-8 jest kodowaniem dla Unicode. Litery OTOH zależą od języka, a jeśli ktoś mówi, że [A-Za-z]są literami, należy określić język, który jest używany
phuclv 15.10.19
32

Najbliższa dostępna opcja to

[\u\l]+

który pasuje do sekwencji wielkich i małych liter. Jednak nie jest obsługiwany przez wszystkie edytory / języki, więc korzystanie z niego jest prawdopodobnie bezpieczniejsze

[a-zA-Z]+

jak sugerują inni użytkownicy

niebieska notatka
źródło
1
Nie pasuje jednak do żadnych znaków specjalnych.
Nyerguds
20

Użyłbyś

/[a-z]/gi

[] - sprawdza wszelkie znaki między podanymi danymi wejściowymi

az --- obejmuje cały alfabet

g ----- globalnie w całym ciągu

i ----- uzyskiwanie wielkich i małych liter

Scott
źródło
14

Wyrażenie regularne, które kilka osób napisało jako „/ ^ [a-zA-Z] $ / i” jest niepoprawne, ponieważ w końcu wspomniały / i, które nie rozróżnia wielkości liter i po dopasowaniu po raz pierwszy wróci. Zamiast / używam po prostu / g, który jest globalny, a ty nie musisz umieszczać ^ $ na początku i na końcu.

/[a-zA-Z]+/g
  1. [a-z _] + pasuje do pojedynczego znaku na poniższej liście
  2. Kwantyfikator: + Od jednego do nieograniczonego czasu, tyle razy, ile to możliwe, zwracając w razie potrzeby
  3. az pojedynczy znak z zakresu od a do z (rozróżnia małe i duże litery)
  4. AZ pojedynczy znak z zakresu od A do Z (rozróżnia małe i wielkie litery)
  5. modyfikator g : globalny. Wszystkie mecze (nie wracaj przy pierwszym meczu)
Yogesh Chauhan
źródło
13

Jawa:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}
Udeshika Sewwandi
źródło
4
nie zawiera znaków diakrytycznych, takich jakŹŻŚĄ
karoluS
11

W przypadku PHP następujące będą działać poprawnie

'/^[a-zA-Z]+$/'
Rohit Dubey
źródło
7

Używaj grup postaci

\D

Dopasowuje dowolny znak oprócz cyfr 0–9

^\D+$

Zobacz przykład tutaj

Tomáš Nedělka
źródło
8
Będzie to również pasować do białych znaków, symboli itp., Co nie wydaje się być tym, o co pyta pytanie.
DaveMongoose
Dziwne. Właśnie oceniłem to i to nie ja!
Dave Everitt
6

Po prostu użyj \wlub [:alpha:]. To sekwencje specjalne, które pasują tylko do symboli, które mogą pojawić się w słowach.

Agaspher
źródło
9
\wmoże nie być dobrym rozwiązaniem we wszystkich przypadkach. Przynajmniej w PCRE,\w może również pasować do innych postaci. Cytując instrukcję PHP : Znak „słowo” to dowolna litera lub cyfra lub znak podkreślenia, czyli dowolny znak, który może być częścią „słowa” Perla. Definicja liter i cyfr jest kontrolowana przez tabele znaków PCRE, i mogą się różnić, jeśli ma miejsce dopasowanie specyficzne dla ustawień narodowych. Na przykład w ustawieniach narodowych „fr” (francuski) niektóre litery znaków większe niż 128 są używane dla liter akcentowanych i są dopasowywane przez \ w. ”.
Amal Murali
słowa zawierają inne znaki z liter
V-SHY
2
\woznacza dopasuj litery i cyfry
Eugen Konkov
4

Jeśli masz na myśli jakiekolwiek litery w jakimkolwiek kodowaniu znaków, dobrym rozwiązaniem może być usunięcie nieliterowych znaków, takich jak spacje \s, cyfry \di inne znaki specjalne, takie jak:

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

Lub użyj negacji powyższej negacji, aby bezpośrednio opisać dowolne litery:

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

Plusy:

  • Działa ze wszystkimi smakami wyrażeń regularnych.
  • Łatwy do napisania, czasem oszczędza dużo czasu.

Cons:

  • Długie, czasem nie idealne, ale kodowanie znaków również może zostać złamane.
Sławomir Lenart
źródło
4

Możesz wypróbować to wyrażenie regularne: [^\W\d_]lub [a-zA-Z].

Motlab
źródło
To nie [^\W|\d]znaczy
OGHaza,
1
[^\W|\d]znaczy nie \Wi nie |i nie \d. Ma ten sam efekt netto, ponieważ |jest częścią, \Wale |nie działa tak, jak myślisz. Nawet wtedy oznacza to, że akceptuje _postać. Prawdopodobnie szukasz[^\W\d_]
OGHaza,
Zgadzam się z tobą, akceptuje _. Ale „NIE” |jest równe „I”, więc [^\W|\d]oznacza: NIE \W I NIE\d
Motlab
12
[^ab]znaczy nie ai nie b. [^a|b]znaczy nie ai nie |i nie b. Aby dać drugi przykład [a|b|c|d]jest dokładnie taka sama jak [abcd|||]która jest dokładnie taka sama, jak [abcd|]- z których wszystkie są równe jest dosłowny charakter, a nie operator OR. Operator OR jest sugerowany między każdym znakiem w klasie znaków, co oznacza, że ​​klasa ma akceptować znak (potok). ([a]|[b]|[c]|[d]|[|])|||
OGHaza
1

Ostatnio używałem tego wzoru w swoich formularzach do sprawdzania nazwisk osób, zawierających litery, spacje i znaki specjalne, takie jak znaki akcentujące.

pattern="[A-zÀ-ú\s]+"
camilablnpa
źródło
Powinieneś spojrzeć na tabelę ASCII. A-zdopasowuje więcej niż tylko litery, a takżeÀ-ú
Toto
0

wzór = / [a-zA-Z] /

wstawia „[a-zA-Z]: # {pattern.match („ mine blossom ”)}„ OK

wstawia „[a-zA-Z]: # {pattern.match („ 456 ”)}”

wstawia „[a-zA-Z]: # {pattern.match („ ”)}”

wstawia „[a-zA-Z]: # {pattern.match („ # $% ^ & * ”)}”

wstawia „[a-zA-Z]: # {pattern.match („ # $% ^ & * A ”)}„ OK

Snm Maurya
źródło
3
A na przykład „Zażółć gęslą jaźń”?
Świadek
-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

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

   ...do something ......
}
Fikreselam Elala
źródło