2015-09-30 11 views
6

Mam świadomość, że kwestia dotycząca znaku dolara "$" w regex (tutaj: w PHP i JavaScript) została omawiane wiele razy wcześniej: Tak, wiem, że muszę dodać przed nim ukośnik odwrotny "\" (w zależności od przetwarzania ciągu nawet dwóch), ale poprawnym sposobem na dopasowanie znaku dolara jest "\ $". ... Byłem tam, robiłem to, działa dobrze.


Ale oto mój nowy problem: Znaki dolara "\ $" obok granic słów oznaczonych "\ b". ... Moje kolejne przykłady można łatwo odtworzyć na przykład w regexpal.com.

Zacznijmy poniższym tekście, aby szukać w:

Dolara 50

Dollars 50

50 $

USD 50

Moje regex powinny znaleźć "USD", "Dolar" lub "$". Dość łatwe: Spróbujmy

(USD | Dolar | \ $)

sukcesu: ona znajdzie "$", w "USD" i zarówno "dolara" zdarzeń, w tym w „dolarach ".

Ale spróbujmy pominąć "dolarów" dodając granicy słowa po wielokrotnego wyboru:

(USD | Dolar | \ $) \ b

I to jest problem " USD "jest dopasowany," Dollar "jest dopasowany," Dollars "jest odrzucony ... Ale pojedynczy, poprawnie backslashed (lub escaped)" $ "jest również odrzucany, chociaż to działało przed chwilą.

To nie wiąże się z pytań wielokrotnego wyboru wewnątrz nawiasów: Spróbuj tylko

\ $

vs.

\ $ \ b

i jest tak samo: pierwszy dopasowuje się do znaku dolara, drugi jeden nie.


Innym odkryciem:

(USD | Dolar | \ $) \ b

z blank "" pomiędzy ")" i "\ b" faktycznie działa . Ale to obejście może nie być opłacalne w każdych okolicznościach (na wypadek, gdyby granica nie była pusta).


Wygląda na to, że uciekł znak dolara, odmawia się znalezienia, gdy zaangażowane są granice słów.

Chciałbym usłyszeć wasze sugestie, aby rozwiązać tę zagadkę. -- Z góry dziękuję!

+0

Od [MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions): * "Granica słowa odpowiada pozycji, w której znak słowny nie jest śledzony lub poprzedzony innym znakiem słownym. "* Jednak' $' i spacje nie są znakami słownymi. –

Odpowiedz

2

Nie pasuje, ponieważ w $ nie ma granicy słowa bezpośrednio po $. Nie byłoby jednak, jeśli słowo rozpocząć natychmiast po $ - na przykład

$ Miliony

będzie pasował.

Co prawdopodobnie chcesz zrobić jest, aby \b zastosowanie jedynie do tych przypadków, w których naprawdę chcesz dopasować granicę słowa - na przykład

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

To będzie nalegać na nie bycie granica słowo po "USD" i po "Dolarze", ale nie po "$".

+0

'((USD | Dollar) \ b | \ $)' również będzie działało –

Powiązane problemy