正则表达式中带有单词边界"\b"的美元符号"\$"(PHP / JavaScript)是什么意思?

9
我知道涉及正则表达式中的美元符号"$"的问题(在这里:无论是在PHP和JavaScript中),已经被讨论了很多次:是的,我知道我需要在它前面添加反斜杠“\”(根据字符串处理甚至需要两个),但正确匹配美元符号的方法是"\$"。......已经做过了,运行良好。
但是这是我的新问题:美元符号"$"紧跟着用"\b"标记的单词边界。......我的以下示例可以在例如regexpal.com上轻松重现。
让我们从要搜索的以下文本开始:
Dollar 50 Dollars 50 $ 50 USD 50
我的正则表达式应该找到"USD"、"Dollar"或"$"。很容易:让我们尝试
(USD|Dollar|\$)
成功:它找到了"$","USD"以及"Dollar"出现的两个位置,包括在"Dollars"中。
但是让我们尝试在多个选择后添加单词边界来跳过"Dollars":
(USD|Dollar|\$)\b
这是麻烦的:匹配"USD",匹配"Dollar",拒绝"Dollars"......但是单个、正确加上反斜杠(或转义)的"$"也被拒绝了,尽管刚才还有效。
这与括号内的多个选择无关:只需尝试
\$
与。
\$\b
它是一样的:第一个匹配美元符号,第二个不匹配。
另一个发现:
(USD|Dollar|\$) \b
在")"和"\b"之间有一个空格实际上可以工作。但是,在某些情况下,这种解决方法可能不可行(如果应该有一个非空白单词边界)。
看来当涉及到单词边界时,转义的美元符号拒绝被找到。
我很想听听您解决这个谜团的建议。--非常感谢!

MDN中得知:"单词边界匹配的位置是指一个单词字符前后没有另一个单词字符。" 然而,$和空格不是单词字符。 - Felix Kling
1个回答

5

这个不匹配,因为在$后面没有立即跟着单词边界\b。如果一个单词紧随$之后,那么它就会匹配成功,例如:

$Millions

将会匹配成功。

您可能想要的是只在真正需要匹配单词边界的情况下才应用\b,例如:

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

这将要求在“USD”后和“Dollar”后都有一个单词边界,但不会在“$”后面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接