Regex: Geben Sie "Leerzeichen oder Anfang der Zeichenfolge" und "Leerzeichen oder Ende der Zeichenfolge" an.

127

Stellen Sie sich vor, Sie versuchen, eine Musterübereinstimmung mit "Stapelüberlauf" durchzuführen.

Sie möchten Folgendes:

 this is stackoverflow and it rocks [MATCH]

 stackoverflow is the best [MATCH]

 i love stackoverflow [MATCH]

 typostackoverflow rules [NO MATCH]

 i love stackoverflowtypo [NO MATCH]

Ich kann den Stackoverflow analysieren, wenn auf beiden Sites Leerzeichen vorhanden sind.

/\s(stackoverflow)\s/

Gleiches gilt, wenn es am Anfang oder Ende eines Strings steht:

/^(stackoverflow)\s/

/\s(stackoverflow)$/

Aber wie geben Sie "Leerzeichen oder Ende der Zeichenfolge" und "Leerzeichen oder Anfang der Zeichenfolge" mit einem regulären Ausdruck an?

anonym-one
quelle

Antworten:

172

Sie können eine der folgenden Optionen verwenden:

\b      #A word break and will work for both spaces and end of lines.
(^|\s)  #the | means or. () is a capturing group. 


/\b(stackoverflow)\b/

Wenn Sie den Platz nicht in Ihr Match aufnehmen möchten, können Sie Lookbehind / Aheads verwenden.

(?<=\s|^)         #to look behind the match
(stackoverflow)   #the string you want. () optional
(?=\s|$)          #to look ahead.
Jacob Eggers
quelle
8
\bist eine Behauptung mit einer Breite von Null; Es verbraucht niemals Zeichen. Es ist nicht nötig, es in einen Lookaround zu wickeln.
Alan Moore
2
Beachten Sie, dass in den meisten Regexp-Implementierungen \bnur Standard-ASCII verwendet wird, dh keine Unicode-Unterstützung. Wenn Sie Unicode-Wörter suchen
Mahn
4
Der einfachere Weg, die Gruppenauswahl vom Spiel auszuschließen, ist(?:^|\s)
user2426679
7
für Python, ersetzen (?<=\s|^)mit (?:(?<=\s)|(?<=^)). Andernfalls erhalten Sieerror: look-behind requires fixed-width pattern
user2426679
4
Die \bwürden andere Zeichen - wie " ." als Wortbrecher betrachten, während der Fragesteller ausdrücklich "Leerzeichen" sagte. @ gordys Lösung scheint besser zu sein.
Mikhail T.
65

(^|\s)würde mit Leerzeichen oder Beginn der Zeichenfolge und ($|\s)mit Leerzeichen oder Ende der Zeichenfolge übereinstimmen . Zusammen ist es:

(^|\s)stackoverflow($|\s)
gordy
quelle
4
Dies ist die einzige, die für mich funktioniert. danke @gordy
robsonrosa
2
Wenn Sie dieses Muster zum Ersetzen verwenden, denken Sie daran, die Leerzeichen im ersetzten Ergebnis beizubehalten, indem Sie sie durch das Muster ersetzen $1string$2.
Mahn
Dies ist die einzige, die auch für mich funktioniert. Wortgrenzen scheinen nie zu tun, was ich will. Zum einen stimmen sie mit einigen Zeichen neben Leerzeichen überein (wie Bindestriche). Dies löste es für mich , weil ich versucht hatte zu setzen $und ^eine Zeichenklasse in, aber das zeigt sie können einfach in eine regelmäßiges Muster Gruppe gestellt werden.
Felwithe
17

Folgendes würde ich verwenden:

 (?<!\S)stackoverflow(?!\S)

Mit anderen Worten, stimmen Sie mit "stackoverflow" überein, wenn ihm kein Nicht-Leerzeichen vorangestellt ist und kein Nicht-Leerzeichen folgt .

Dies ist ordentlicher (IMO) als der "Space-or-Anchor" -Ansatz, und es wird nicht davon ausgegangen, dass die Zeichenfolge wie der \bAnsatz mit Wortzeichen beginnt und endet .

Alan Moore
quelle
1
Gute Erklärung, warum man das benutzt. Ich hätte dies ausgewählt, aber die getestete Zeichenfolge ist IMMER eine einzelne Zeile.
anonym-eins
7

\b stimmt an Wortgrenzen überein (ohne tatsächlich mit Zeichen übereinzustimmen), daher sollte Folgendes tun, was Sie wollen:

\bstackoverflow\b
Andrew Clark
quelle
Für Python hilft es, eine rohe Zeichenfolge anzugeben , z. B.mystr = r'\bstack overflow\b'
Acumenus