如何理解正则表达式'\ b'?

时间:2016-10-28 05:38:47

标签: javascript regex string

我正在学习正则表达式。但我无法理解'\ b',匹配单词边界。有三种情况,如:

  1. 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  2. 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  3. 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  4. 我无法理解第三种情况。例如:

    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不会永远退出。 再次感谢

3 个答案:

答案 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...

a demo on regex101.com

<小时/> 最后,您可以将\b视为零宽度断言,它只能确保字符串中的位置。

答案 2 :(得分:0)

试试这个表达式

/(end)\b|\b(end)/g