2015-09-30 10 views
6

Ich bin mir bewusst, dass das Problem mit dem Dollarzeichen "$" in Regex (hier: entweder in PHP und JavaScript) aufgetreten ist mehrfach besprochen: Ja, ich weiß, dass ich davor einen Backslash "\" einfügen muss (abhängig von der String-Verarbeitung sogar zwei), aber die korrekte Art, ein Dollarzeichen zu finden, ist "\ $". ... war dort, das getan, funktioniert gut.

Aber hier ist mein neues Problem: Dollarzeichen "\ $" neben Wortgrenzen mit "\ b" markiert. ... Meine folgenden Beispiele können leicht auf z.B. regexpal.com.

Beginnen wir mit dem folgenden Text beginnen in suchen:

Dollar 50

50 Dollars

$ 50

USD

sollte meine regex finden entweder "USD", "Dollar" oder "$". Leicht genug: Lassen Sie uns versuchen

(USD | Dollar | \ $)

Erfolg: Es findet die "$", die "USD" und beide "Dollar" Vorkommen, unter anderem in „Dollar ".

Aber lassen Sie uns versuchen, die "Dollars" zu überspringen, indem Wortgrenzen nach dem Multiple-Choice-Zugabe:

(USD | Dollar | \ $) \ b

Und das ist Ärger: " USD "wird abgeglichen," Dollar "wird abgeglichen," Dollars "wird abgelehnt ... Aber die Single, richtig zurückgehebelt (oder geflohen)" $ "wird ebenfalls abgelehnt, obwohl das nur eine Sekunde zuvor funktioniert hat.

Es ist nicht in den Klammern auf den Multiple-Choice bezogen werden: nur

\ $

gegen

\ $ \ b

Versuche und Es ist genau das gleiche: Das erste stimmt mit dem Dollarzeichen überein, das zweite das tut man nicht.


Eine weitere Erkenntnis:

(USD | Dollar | \ $) \ b

mit einem leeren "" zwischen dem ")" und der "\ b" tatsächlich funktioniert . Diese Problemumgehung ist unter Umständen jedoch nicht durchführbar (falls eine Wortgrenze für Leerzeichen vorhanden sein sollte).


Es scheint, dass das entwischte Dollarzeichen nicht gefunden werden kann, wenn Wortgrenzen involviert sind.

Ich würde gerne Ihre Vorschläge hören, um dieses Geheimnis zu lösen. -- Vielen Dank im Voraus!

+0

Von [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions): * "Eine Wortgrenze entspricht der Position, an der einem Wortzeichen nicht gefolgt oder vorangestellt wird durch ein anderes Wort-Zeichen. "* $ und Leerzeichen sind jedoch keine Wortzeichen. –

Antwort

2

Es stimmt nicht überein, denn in $ gibt es keine Wortgrenze unmittelbar nach $. Es wäre jedoch, wenn ein Wort unmittelbar nach dem $ gestartet - zum Beispiel

Millions $

wird übereinstimmen.

Was Sie wahrscheinlich tun möchten, ist die \b gelten nur für jene Fälle zu machen, wo man wirklich eine Wortgrenze wollen entsprechen - zum Beispiel

(USD\b|Dollar\b|\$) 

Das dort ist eine Wortgrenze bestehen wird nach "USD" und nach "Dollar", aber nicht nach "$".

+0

'((USD | Dollar) \ b | \ $)' würde auch funktionieren –

Verwandte Themen