我正在学习正则表达式。但我无法理解'\ b',匹配单词边界。有三种情况,如:
我无法理解第三种情况。例如:
var reg = /end\bend/g;
var string = 'wenkend,end,end,endend';
alert( reg.test(string) ) ; //false
'\ b'一侧需要'\ w'字符,另一侧不需要'\ w'字符。字符串'end,end'应该匹配规则,在第一个字符是字符串','之后,在最后一个字符是字符串','之前,那么为什么结果是错误的。请你帮忙,在此先感谢!
============分界线=============
在你的帮助下,我明白了。 'end,end'匹配第一个'end'并且有一个边界,但是下一个字符是','而不是'e',所以'/ end \ bend'是假的。
换句话说,reg'/ end \ bend / g'或其他类似的reg不会永远退出。 再次感谢
答案 0 :(得分:6)
\b
匹配位置,而不是角色。所以这个正则表达式/end\bend/g
表示必须有字符串end
。然后它应该跟不是单词字符,即,
并匹配,但正则表达式引擎不会在字符串中移动而且它保持在,
。因此,正则表达式中的下一个字符是e
,而e
与,
不匹配。所以regexp失败了。这是一步一步发生的事情:
-----------------
/end\bend/g, "end,end" (match)
| |
-----------------
/end\bend/g, "end,end" (both regex and string position moved - match)
| |
------------------
/end\bend/g, "end,end" (the previous match was zero-length, so only regex position moved - not match)
| |
答案 1 :(得分:4)
使用(大多数)正则表达式引擎,您可以在字符串中匹配,捕获字符和断言位置。
出于本示例的目的,我们假设字符串
Rogue One: A Star Wars Story
您希望匹配字符o
(在R
之后和t
之后有两次)。现在您要指定位置,并希望仅在小写o
之前匹配r
。
你写(带有积极的向前看):
o(?=r)
现在概括零宽度断言的想法,你想要在前面找到一个单词 ,同时确保后面没有单词字符。所以你可以写:
(?=\w)(?<!\w)
正面和负面的前瞻,相结合。我们几乎就在那里:)你只需要相同的东西(后面的一个单词字符和不前面的单词字符),这是:
(?<=\w)(?!\w)
如果你将这两者结合起来,你最终会得到(见中间的|
):
(?:(?=\w)(?<!\w)|(?<=\w)(?!\w))
<小时/> 这相当于
\b
(并且更长)。回到我们的字符串,这适用于:
Rogue One: A Star Wars Story
# right before R
# right after e in Rogue
# right before O of One
# right after e of One (: is not a word character)
# and so on...
<小时/>
最后,您可以将\b
视为零宽度断言,它只能确保字符串中的位置。
答案 2 :(得分:0)
试试这个表达式
/(end)\b|\b(end)/g