Regex, um nur Buchstaben zuzuordnen


374

Wie kann ich einen regulären Ausdruck schreiben, der nur Buchstaben entspricht?


58
Was ist deine Definition von characters? ASCII? Kanji? Iso-XXXX-X? UTF8?
Ivo Wetzel

45
Was ist deine Definition von regex? Perl? Emacs? Grep?
Pascal Cuoq

4
Angesichts der Tatsache, dass die Frage auf Englisch ist, ist es auf einer englischen Website fair anzunehmen, dass die Frage Zeichen auf Englisch betrifft.
Vaer-k

1
Ich habe festgestellt, dass \ p {L} für einen Buchstaben und / u Flag für den Unicode mit jedem Buchstaben in meinem /\p{L}+/u
regulären Ausdruck übereinstimmt,

4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. Das ist wahr. Wie wir alle wissen, lokalisieren Englisch sprechende NIEMALS ihre Anwendungen!
Alex

Antworten:


392

Verwenden Sie einen Zeichensatz: [a-zA-Z]Entspricht einem Buchstaben von A bis Z in Klein- und Großbuchstaben. [a-zA-Z]+stimmt mit einem oder mehreren Buchstaben ^[a-zA-Z]+$überein und stimmt nur mit Zeichenfolgen überein, die nur aus einem oder mehreren Buchstaben bestehen ( ^und $markiert den Anfang bzw. das Ende einer Zeichenfolge).

Wenn Sie andere Buchstaben als A - Z finden möchten, können Sie sie entweder dem Zeichensatz hinzufügen : [a-zA-ZäöüßÄÖÜ]. Oder Sie verwenden vordefinierte Zeichenklassen wie die Unicode - Zeichen Eigenschaft Klasse , \p{L}die die Unicode - Zeichen beschrieben , die Buchstaben sind.


119
Das ist eine sehr ASCII-zentrierte Lösung. Dies wird auf so ziemlich jedem nicht englischen Text brechen.
Joachim Sauer

7
@ Joachim Sauer: Es wird eher auf Sprachen mit nicht-lateinischen Zeichen brechen.
Gumbo

15
Bricht bereits 90% des deutschen Textes ab, erwähnt nicht einmal Französisch oder Spanisch. Italienisch könnte trotzdem ziemlich gut abschneiden.
Ivo Wetzel

9
Das hängt davon ab, welche Definition von "lateinischem Charakter" Sie wählen. J, U, Ö, Ä können je nach Ihrer Definition als lateinische Zeichen bezeichnet werden oder nicht. Sie werden jedoch alle in Sprachen verwendet, in denen das "lateinische Alphabet" zum Schreiben verwendet wird.
Joachim Sauer

9
\ p {L} passt zu allen Umlauten, Sedilla-Akzenten usw., also sollten Sie damit weitermachen.
Radu Simionescu

198

\p{L} passt zu allem, was ein Unicode-Buchstabe ist, wenn Sie an Alphabeten interessiert sind, die über das lateinische hinausgehen


2
nicht in allen Regex-Geschmacksrichtungen. Beispielsweise werden vim-Regexe \pals "druckbares Zeichen" behandelt.
Philip Potter

3
Diese Seite schlägt vor, dass nur Java-, .net-, Perl-, Jgsoft-, XML- und XPath-Regexes \ p {L} unterstützen. Aber wichtige Auslassungen: Python und Ruby (obwohl Python das Regex-Modul hat).
Philip Potter

6
@Philip Potter: Ruby unterstützt Unicode-Zeicheneigenschaften mit genau derselben Syntax.
Jörg W Mittag

6
Ich denke, dies sollte sich \p{L}\p{M}*+um Buchstaben handeln, die aus mehreren Codepunkten bestehen, z. B. einen Buchstaben, gefolgt von Akzentzeichen. Gemäß
regulär-

mit Python 3 ergibt dies einen Fehlerbad escape \p at position 0
Matanster

46

Abhängig von Ihrer Bedeutung von "Charakter":

[A-Za-z]- alle Buchstaben (Groß- und Kleinbuchstaben)

[^0-9] - alle nichtstelligen Zeichen


Ich meinte Briefe. Es scheint jedoch nicht zu funktionieren. preg_match ('/ [a-zA-Z] + /', $ name);
Nike

[A-Za-z] ist nur die Deklaration von Zeichen, die Sie verwenden können. Sie müssen noch angeben, wie viele Male diese Deklaration verwendet werden muss: [A-Za-z] {1,2} (um 1 oder 2 Buchstaben abzugleichen) oder [A-Za-z] {1, *} (um übereinzustimmen 1 oder mehr Buchstaben)
KristofMols

17
Nun, à, á, ã, Ö, Ä ... sind auch Buchstaben, ebenso wie অ, আ, ই, ঈ, Є, Ж, З, ﺡ, ﺥ, ﺩ, ב, ג, ש, ת, ... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv

@phuclv: In der Tat, aber das hängt von der Codierung ab, und die Codierung ist Teil der Einstellungen des Programms (entweder die Standardkonfiguration oder die in einer Konfigurationsdatei des Programms deklarierte). Wenn ich an verschiedenen Sprachen gearbeitet habe, habe ich das in einer Konstanten in einer Konfigurationsdatei gespeichert.
Catalina Chircu

1
Die @ CatalinaChircu-Codierung ist hier absolut irrelevant. Die Codierung ist eine Möglichkeit, einen Codepunkt in einem Zeichensatz in Binärform zu codieren. Beispielsweise ist UTF-8 eine Codierung für Unicode. Buchstaben OTOH hängt von der Sprache ab, und wenn man sagt, dass [A-Za-z]es sich um Buchstaben handelt, muss die verwendete Sprache angegeben werden
phuclv

32

Die nächstgelegene verfügbare Option ist

[\u\l]+

Dies entspricht einer Folge von Groß- und Kleinbuchstaben. Es wird jedoch nicht von allen Editoren / Sprachen unterstützt, daher ist es wahrscheinlich sicherer zu verwenden

[a-zA-Z]+

wie andere Benutzer vorschlagen


1
Es werden jedoch keine Sonderzeichen gefunden.
Nyerguds

20

Sie würden verwenden

/[a-z]/gi

[] - prüft, ob zwischen den Eingaben Zeichen vorhanden sind

az --- deckt das gesamte Alphabet ab

g ----- global über die gesamte Zeichenfolge

i ----- Groß- und Kleinschreibung


14

Ein regulärer Ausdruck, den nur wenige Leute als "/ ^ [a-zA-Z] $ / i" geschrieben haben, ist nicht korrekt, da sie zuletzt / i erwähnt haben, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird und nach dem ersten Abgleich zurückgegeben wird. Anstelle von / verwende ich nur / g, was für global ist, und Sie müssen auch ^ $ nicht zum Starten und Beenden eingeben.

/[a-zA-Z]+/g
  1. [a-z _] + einem einzelnen Zeichen in der folgenden Liste
  2. Quantifizierer: + Zwischen ein und unbegrenzt oft, so oft wie möglich, nach Bedarf zurückgeben
  3. az ein einzelnes Zeichen im Bereich zwischen a und z (Groß- und Kleinschreibung beachten)
  4. AZ ein einzelnes Zeichen im Bereich zwischen A und Z (Groß- und Kleinschreibung beachten)
  5. g Modifikator: global. Alle Spiele (nicht beim ersten Spiel zurückkehren)

13

Java:

String s= "abcdef";

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

4
es enthält keine diakritischen Zeichen wieŹŻŚĄ
karoluS



7

Verwenden Sie Zeichengruppen

\D

Entspricht jedem Zeichen außer den Ziffern 0-9

^\D+$

Siehe Beispiel hier


8
Dies stimmt auch mit Leerzeichen, Symbolen usw. überein, was nicht das zu sein scheint, wonach die Frage fragt.
DaveMongoose

Seltsam. Ich habe gerade eine Gegenstimme dazu bekommen, und ich bin es nicht!
Dave Everitt

6

Verwenden Sie einfach \woder [:alpha:]. Es handelt sich um eine Escape-Sequenz, die nur Symbolen entspricht, die möglicherweise in Wörtern vorkommen.


9
\wist möglicherweise nicht in allen Fällen eine gute Lösung. Zumindest in PCRE \wkönnen auch andere Zeichen übereinstimmen. Zitat aus dem PHP-Handbuch : " Ein" Wort "-Zeichen ist ein beliebiger Buchstabe oder eine Ziffer oder ein Unterstrich, dh ein beliebiges Zeichen, das Teil eines Perl-" Wortes "sein kann. Die Definition von Buchstaben und Ziffern wird durch die Zeichentabellen von PCRE gesteuert. und kann variieren, wenn ein länderspezifischer Abgleich stattfindet. Beispielsweise werden im Gebietsschema "fr" (Französisch) einige Zeichencodes größer als 128 für Buchstaben mit Akzent verwendet, und diese werden mit \ w abgeglichen. "
Amal Murali

Wörter enthalten andere Zeichen aus Buchstaben
V-SHY

2
\wbedeutet übereinstimmende Buchstaben und Zahlen
Eugen Konkov

4

Wenn Sie Buchstaben in einer beliebigen Zeichenkodierung meinen, besteht ein guter Ansatz darin, Nichtbuchstaben wie Leerzeichen \s, Ziffern \dund andere Sonderzeichen wie:

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

Oder verwenden Sie die Negation der obigen Negation, um Buchstaben direkt zu beschreiben:

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

Vorteile:

  • Funktioniert mit allen Regex-Aromen.
  • Einfach zu schreiben, manchmal viel Zeit sparen.

Nachteile:

  • Lang, manchmal nicht perfekt, aber auch die Zeichenkodierung kann unterbrochen werden.

4

Sie können diesen regulären Ausdruck ausprobieren: [^\W\d_]oder [a-zA-Z].


Das ist nicht was [^\W|\d]bedeutet
OGHaza

1
[^\W|\d]bedeutet nicht \Wund nicht |und nicht \d. Es hat den gleichen Nettoeffekt, da |es Teil von ist, \Waber das |funktioniert nicht so, wie Sie denken. Selbst dann bedeutet das, dass es den _Charakter akzeptiert . Sie suchen wahrscheinlich[^\W\d_]
OGHaza

Ich stimme dir zu, es akzeptiert das _. Aber "NICHT" |ist gleich "UND", [^\W|\d]bedeutet also: NICHT \W UND NICHT\d
Motlab

12
[^ab]bedeutet nicht aund nicht b. [^a|b]bedeutet nicht aund nicht |und nicht b. Ein zweites Beispiel zu geben [a|b|c|d]ist genau das gleiche wie [abcd|||]das, was genau das gleiche ist wie [abcd|]- alles, was ([a]|[b]|[c]|[d]|[|])dem entspricht, |ist ein Literalzeichen, kein ODER-Operator. Der OR-Operator wird zwischen jedem Zeichen in einer Zeichenklasse impliziert. Dies |bedeutet, dass die Klasse das |(Pipe-) Zeichen akzeptieren soll .
OGHaza

1

In letzter Zeit habe ich dieses Muster in meinen Formularen verwendet, um Namen von Personen zu überprüfen, die Buchstaben, Leerzeichen und Sonderzeichen wie Akzentzeichen enthalten.

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

Sie sollten sich eine ASCII-Tabelle ansehen. A-zpasst mehr als nur Buchstaben, sowieÀ-ú
Toto

0

Muster = / [a-zA-Z] /

setzt "[a-zA-Z]: # {pattern.match (" meine Blüte ")}" OK

setzt "[a-zA-Z]: # {pattern.match (" 456 ")}"

setzt "[a-zA-Z]: # {pattern.match (" ")}"

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

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


3
Und was ist zum Beispiel mit „Zażółć gęslą jaźń“?
Der Zeuge

-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");

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

   ...do something ......
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.