【问题标题】:How to understand regex '\b'?如何理解正则表达式'\b'?
【发布时间】:2016-10-28 05:38:47
【问题描述】:

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

  1. 在字符串的第一个字符之前,如果第一个字符是单词字符。
  2. 在字符串的最后一个字符之后,如果最后一个字符是单词字符。
  3. 字符串中两个字符之间,一个是单词字符,另一个不是单词字符。

第三种情况我看不懂。例如:

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

【问题讨论】:

  • \b 没有捕获任何内容
  • 你的正则表达式应该是/end\b,\bend/g
  • \b 不匹配字符,它匹配字符之间的一个点,一个边界。当\b 旁边的两个字符都是单词字符时,那里不可能有单词边界。您可能想到的正则表达式是 /end\Wend/g
  • @Anan:逗号不是边界。逗号前后有边界,但逗号本身不是边界。
  • @Anan 对,/end\bend/ 不能匹配任何东西,因为它会匹配endend,但是中间的de 之间没有单词边界,所以匹配失败。

标签: javascript regex string


【解决方案1】:

\b 匹配位置,而不是字符。所以这个正则表达式/end\bend/g 说必须有字符串end。然后它后面应该不是一个单词字符,它是, 并且它匹配,但是正则表达式引擎不会在字符串中移动并且它停留在,。所以你的正则表达式中的下一个字符是e,而e, 不匹配。所以正则表达式失败。这是一步一步发生的事情:

-----------------
/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)
      |            |

【讨论】:

    【解决方案2】:

    使用(大多数)正则表达式引擎,您可以在字符串中匹配捕获字符和断言位置。

    为了这个例子的目的,让我们假设字符串

    Rogue One: A Star Wars Story
    

    您要匹配字符o 的位置(在Rt 之后出现两次)。现在您要指定位置,并且只想在小写rs 之前匹配os。
    你写(积极的前瞻):

    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 视为零宽度断言,它仅确保字符串中的位置。

    【讨论】:

    • 仅供参考,tchrist's answer 还描述了“条件”(实际上是上下文)单词边界行为。
    【解决方案3】:

    试试这个表达式

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

    【讨论】:

    • 了解正则表达式的工作原理
    • 这里的目标不是给他们一条鱼,而是教人们如何钓鱼。这个答案没有帮助。
    • 这就是为什么我从我了解正则表达式的地方发布网站链接...
    • 她可以在那边尝试一切与RE相关的东西
    • 对,这些链接对学习正则表达式肯定有帮助,但你的回答没有帮助。这是一个路标,上面写着,“答案隐藏在这里--->”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2017-11-25
    • 1970-01-01
    • 2015-02-20
    • 2022-12-18
    相关资源
    最近更新 更多