使用正则表达式匹配表达式
\b.*#\b
为什么这两个示例匹配如下(突出显示):
a #b #
c#
a #b #c #
d
具体来说,第一个不匹配的字符串怎么会包含最后一个#之前的所有内容?
由于单词边界(\ b)为零宽度匹配,因此可以在单词字符(\ w)与非单词字符(\ W)之间或单词字符与字符串的开头或结尾之间进行匹配,我不确定以非单词字符结尾的表达式将如何影响匹配。
答案 0 :(得分:1)
这是您当前的正则表达式:
\b.*#\b
这是第一个示例输入:
a #b #c #
^^^^^^ <-- last word boundary is here
第一个单词边界实际上发生在开头a
之前。然后,.*
将贪婪地消耗掉所有内容,直到 last #
,其后是单词边界。如您所引用的,单词和非单词字符之间会出现单词边界,反之亦然。上一次发生这种情况的时间是#c
,因为最后一个#
(请记住#
不是单词字符)紧跟着单词字符
如果您只想获取所有以#
结尾的单词,则只需使用以下内容:
[^# ]+#
答案 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 只能匹配字母,数字,下划线和汉字。可惜的是,#不在其中。