Regex, aby dopasować tylko litery


374

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


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.


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


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


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


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


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)

13

Jawa:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}

4
nie zawiera znaków diakrytycznych, takich jakŹŻŚĄ
karoluS



7

Używaj grup postaci

\D

Dopasowuje dowolny znak oprócz cyfr 0–9

^\D+$

Zobacz przykład tutaj


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.


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.

4

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


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]+"

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


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 ......
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.