表达式<[^>]*>(*SKIP)(*F)|(\/|\s|^|\()(Dakota Ridge.*?)(,|\.|\s|\b|\)|<)
符合预期字符串Dakota Ridge
中的The Dakota Ridge Trail is open.
。
但是,如果我将Dakota Ridge Trail
包裹在HTML标记中,则该字符串将不再匹配:The <b>Dakota Ridge Trail</b> is open.
我认为^
替代方案会断言字符串是在开始时锚定的,因为(*SKIP)
会阻止引擎回溯到该点,但显然它不会那样工作。
如果在跳过且失败的匹配后字符串锚定在第一个位置,如何修改此表达式以匹配?
编辑以澄清:<[^>]*>(*SKIP)(*F)
的目的是跳过可能包含模式的HTML标记。
答案 0 :(得分:1)
你的正则表达式与第二次匹配不匹配,因为你要匹配的子字符串前面有一个>
,它在SKIP-FAIL完成其工作后被消耗并被丢弃。这意味着(\/|\s|^|\()
模式无法匹配Dakota
之前的空格,因为它不是/
,也不是空格,字符串的开头或(
。
由于您在尾随位置有一个\b
字边界,您也可以在租赁位置使用它,并进一步使用外观限制上下文(例如,lookbehind)。
对于当前场景,以下内容将执行:
<[^>]*>(*SKIP)(*F)|\b(Dakota Ridge.*?)\b
请参阅regex demo。
<强>详情
<[^>]*>(*SKIP)(*F)
- 匹配<
,然后是>
以外的0 +字符,然后是>
,并丢弃匹配,保持正则表达式索引位于结尾处匹配|
- 或\b
- 字边界(Dakota Ridge.*?)
- 第1组:Dakota Ridge
,然后任意0个字符(除了换行符之外)尽可能少,p到第一个\b
- 字边界。