问题描述
|
假设在一个正则表达式中,如果匹配一个替代项中的一个替代项,即使剩下更多替代项,它也就在此处停止(替代项之外的正则表达式中没有其他标记)。
资源
搜索一个双字(例如
this this
)的模式
\\b([a-z]+)((?:\\s|<[^>]+>)+)(\\1\\b)
如果介绍这个主题,我会感到困惑:
它与样式匹配。
\"<i>whatever<i> whatever\"
\\b([a-z]+)
比赛
((?:<[^>]+>|\\s)+)
跟随一个TAG,因此第二个替代匹配。
(\\1\\b)
如果在第一个括号中反向引用相同的单词,则必须匹配。
如果标签后面没有跟随\'(\\1\\b)
\',则为什么要匹配空格。
我知道在交替中存在“ 7”。
但是难道不应该TAG匹配消耗交替吗?
为什么“ 7”替代仍然存在?
解决方法
交替由
+
量词控制:
(?:\\s|<[^>]+>)+
...因此它尝试匹配多次。每次,它都可以尝试两种选择:首先是\\s
,如果失败,则是<[^>]+>
。
第一次,\\s
不匹配,但是<[^>]+>
成功匹配ѭ15。
\\s
第二次匹配一个空格。
\\s
第三次匹配另一个空格。
...依此类推,直到所有空间都被占用为止。
, “ѭ9”的意思是““ 19中的一个或多个”。是的,它们中的第一个消耗了标签,但是在后面跟着“ 5”之前可能有无限数量的附加标签或空白。
\\b([a-z]+)((?:\\s|<[^>]+>)+)(\\1\\b)
^