2016-10-12 5 views
0

Ich verwende Rails 4.2.7. Ich möchte einen Ausdruck anpassen und den Wortgrenzenausdruck nutzen, da ein Leerzeichen, eine beliebige Anzahl von Leerzeichen oder ein Strich zwischen meinen Wörtern vorhanden sein kann. Aber das funktioniert nichtWarum fängt " b" meine Wortgrenze in Rails nicht ab?

2.3.0 :006 > /first\bsecond/.match('first second') 
=> nil 

Das Handbuch hier - https://ruby-doc.org/core-2.1.1/Regexp.html schlägt vor, dass „\ b“ ist der richtige Ausdruck zu verwenden Wortgrenzen zu fangen so frage ich mich, wo ich falsch gehe.

+0

Siehe http://stackoverflow.com/questions/39875620/python-regex-words-boundary-with-unexpected-results/39876126#39876126. '\ b' stimmt nicht mit den Leerzeichen überein und es gibt eine zwischen' first' und 'second'. –

+1

'\ b' wird normalerweise nur am Anfang oder Ende eines Ausdrucks verwendet, da sein Nutzen an anderen Stellen fraglich ist. – tadman

+0

@tadman es gibt eine Chance, dass '\ b' in der Mitte eines Ausdrucks nützlich sein kann, aber es ist so selten, dass ich nicht an einen realen Anwendungsfall denken kann. So etwas ist eine effiziente Verwendung: '/ [az] \ b [az] /' – Sam

Antwort

1

\b entspricht einer Wortgrenze der Länge Null, kein Leerzeichen. Sie suchen nach etwas mehr wie folgt aus:

/first\b.\bsecond/.match('first second') 

Dieser jedes Zeichen wird (.) zwischen first und second, solange es eine Wortgrenze auf beiden Seiten ist.


Dies ist jedoch nicht, wie Wortgrenzen in der Regel verwendet werden (da es keine Notwendigkeit, eine Null-Längenprüfung zu verwenden, wenn Sie das Wort Grenze selbst passen). \b sucht im Wesentlichen nach einem Wortzeichen nach einem Nicht-Wort-Zeichen; so, stattdessen könnte man für ein Nicht-Wortzeichen aussieht nur in-zwischen den t in first und s in second:

/first\Wsecond/.match('first second') 

Dies ist genau das gleiche wie das erste Beispiel ... aber realistisch gesehen, Sie wahrscheinlich wollen nur Leerzeichen übereinstimmen und so etwas wie diese verwenden:

/first\ssecond/.match('first second') 

@ WiktorStribiżew drittes Beispiel zeigt die beste Verwendung von Wortgrenzen (Anfang und Ende). Dies liegt daran, dass Sie vorher oder nachher nichts zuordnen, daher ist ein Null-Längen-Test hilfreich. Ansonsten könnten die obigen Beispiele etwas wie first secondary entsprechen. Am Ende würde ich einen Ausdruck wie verwenden:

/\bfirst\ssecond\b/.match('first second') 
+1

Oder '/ erste \ ssecond /' oder '/ erste Sekunde /' oder '/ \ erste Sekunde \ b /' –

+0

Danke @ WiktorStribiżew, ich habe gerade die Frage aktualisiert, um zu erklären, warum Sie normalerweise keine Nulllänge verwenden würden in einer Situation wie dieser zusammenpassen. – Sam

+0

Danke, aber die gegebene Antwort schlägt fehl für den Fall /first \ Wsecond/.match('first second '), in dem mehr als ein Leerzeichen zwischen den Wörtern steht. – Dave

Verwandte Themen