2013-08-01 20 views
8

wollen Wort übereinstimmen i.v. Groß- und KleinschreibungRegex mit Wortgrenze aber Wort endet mit a. (Periode)

haben Muster

(?i)\bi\.v\. 

aber eine Wortgrenze wollen am Ende
das obige Muster nicht, dass es passt
IVX

aber wenn ich versuche, eine Arbeitsgrenze zum Ende hinzuzufügen

(?i)\bi\.v\.\b 

schlägt es fehl, dass es nicht sogar i.v. wie ich denke, die \b isst das wörtliche. wie . ist ein Wort
müssen die \. brechen, gierig sein

i
sam i.v. übereinstimmen soll sam

wollen nicht übereinstimmen
sam.i.v. Diese
i.v.sam

näher

(?i)\bi\.v\.\s$ 

aber es funktioniert nicht i.v. finden am Ende einer Zeile

+1

Was ist dein Problem? Warum willst du ein '\ b' am Ende des Ausdrucks? Was kann dieser 'i.v.'-Zeichenfolge folgen, wenn sie übereinstimmen darf? – Qtax

+0

@ Qtax, weil ich nur ein Wortmatch wollen. Das erste Muster entspricht i.v.x. – Paparazzi

+0

Möchten Sie "i.v.x", aber nicht "xxi.v.x" zuordnen? Was ist mit "i.v. x" (mit einem Leerzeichen zwischen dem. Und dem x)? –

Antwort

16

\b nur Übereinstimmungen zwischen einem alphanumerischen Zeichen und einem nicht alphanumerischen Zeichen (oder dem Anfang/Ende der Zeichenfolge). Daher stimmt es nach einer . nicht überein, es sei denn, ein alphanumerisches Zeichen folgt unmittelbar auf diesen Punkt.

Wenn Ihre Absicht, um sicherzustellen, dass kein Nicht-Leerzeichen folgt nach dem Punkt, dann können Sie angeben, dass unter Verwendung eines negative lookahead assertion:

(?i)\bi\.v\.(?!\S) 

(?!\S) bedeutet „Behaupten, dass das nächste Zeichen keine nicht ist -whitespace-Zeichen ".

Das klingt vielleicht etwas verworren - warum das doppelte Negativ? Warum nicht (?=\s) was bedeutet "Stellen Sie sicher, dass das nächste Zeichen ein Leerzeichen ist"? Nun, es gibt einen feinen Unterschied: Die zweite Version benötigt ein Leerzeichen, um dort zu sein; das bedeutet, dass die Regex am Ende der Zeichenfolge nicht übereinstimmen würde. Der erste Regex behandelt auch diesen Eckfall.

Wenn Sie in der Regel das Konzept der „Wortgrenze“ wollen „durch Leerzeichen getrennte“ bedeutet, dann müssen Sie die erste \b auch ersetzen:

(?i)(?<!\S)i\.v\.(?!\S) 

oder die Regex sam.i.v. übereinstimmen, die Sie don Ich will es nicht wollen.

+0

Es macht Sinn und es funktioniert – Paparazzi

+0

Ihre letzte Bearbeitung zu Ihrer Frage verwirrte mich ein wenig (ich las es nur, nachdem ich meine Antwort geschrieben hatte) - Ich habe Ihre Frage kommentiert, können Sie es betrachten? Ich denke, Sie müssen die erste Wortgrenze auch ersetzen ... –

+0

Ich stimme zu. \ b passt auf? i.v. – Paparazzi

2

über Ihre aktuelle regex:

Sie brauchen nicht \b nach Punkt zu haben, da Punkt kein Wortzeichen, aber natürlich galten Punkt zu entkommen muss:

(?i)\bi\.v\. 

Aber Sie müssen \b vor i, um sicherzustellen, dass es z. B. nicht übereinstimmt hi

EDIT: (Basierend auf weitere Änderungen)

diese regex Versuchen:

(?i)\bi\.v\.(?=\s|$) 
+0

schlägt auf sam i.v. sam – Paparazzi

+0

Pls überprüfen Sie diese Demo: http://www.rubular.com/r/dXRpW6aaey – anubhava

+0

Das ist in meiner Frage als Beispiel Ich möchte – Paparazzi

-1

Sie scheint mit Wortgrenzen und gierig Begriffe zu sehr verwirren. Das Beste, was Sie tun können, ist an diese Adressen gehen:

  • was ein gieriger Quantifizierer ist:

http://www.regular-expressions.info/repeat.html

  • was eine Wortgrenze ist:

http://www.regular-expressions.info/wordboundaries.html

Wenn Sie diese Erklärungen lesen, werden Sie sicher denken, dass Ihr Problem lächerlich war.

+0

Warum der Downvote? Weil ich die Antwort nicht gegeben habe? –

+0

Ich glaube, ich habe getan, was ich tun musste, und andere Meinungen sind mir egal. –

+0

Zeigen wie \. gierig und ich gebe dir +1 – Paparazzi

Verwandte Themen