非单词字符的单词边界

时间:2019-05-05 02:34:31

标签: regex

使用正则表达式匹配表达式
\b.*#\b
为什么这两个示例匹配如下(突出显示):

a #b # c#

a #b #c # d

具体来说,第一个不匹配的字符串怎么会包含最后一个#之前的所有内容?

由于单词边界(\ b)为零宽度匹配,因此可以在单词字符(\ w)与非单词字符(\ W)之间或单词字符与字符串的开头或结尾之间进行匹配,我不确定以非单词字符结尾的表达式将如何影响匹配。

3 个答案:

答案 0 :(得分:1)

这是您当前的正则表达式:

\b.*#\b

这是第一个示例输入:

a #b #c #
^^^^^^      <-- last word boundary is here

第一个单词边界实际上发生在开头a之前。然后,.*将贪婪地消耗掉所有内容,直到 last #,其后是单词边界。如您所引用的,单词和非单词字符之间会出现单词边界,反之亦然。上一次发生这种情况的时间是#c,因为最后一个#(请记住#不是单词字符)紧跟着单词字符

如果您只想获取所有以#结尾的单词,则只需使用以下内容:

[^# ]+#

Demo

答案 1 :(得分:1)

在第一个字符串a #b #c #
上 没有单词边界a #b #c # <-here和-> EOS

所以\b.*#\b匹配a #b # c#,因为
a #b # <-在这里和这里-> c#


在第二个a #b #c #d上,这是一个匹配的问题
首先是单词边界,然后是单词边界。
它必须匹配#之后的单词边界,
因此它在a #b #c # <-在这里和这里-> d

之间找到它

单词边界一开始很棘手,
但是,如果您使用一个短语,您将再也不会被它们弄糊涂。

答案 2 :(得分:-2)

\ b 只能匹配字母,数字,下划线和汉字。可惜的是,#不在其中。