我试图在模式中的第一个连字符后抓取文本
<title>.*?-(.*?)(-|<\/title>)
然后从下面的模式中抓取 DesiredText
:
<title>Stuff - DesiredText - Other Stuff</title>
但是在这种模式中:
<title>Stuff - Unwanted - DesiredText - Otherstuff</title>
我希望它跳过'Unwanted'文本并匹配下一个连字符后的文本(DesiredText) . 我用两种模式制作了一个regex101,并且需要修改我的基本正则表达式,这样如果一个或多个我不想匹配的单词出现在 capture group
中,那么它会匹配第二个连字符文本:
3 回答
我相信这就是你要找的东西 . 关键是在方括号字符列表(
[]
)中使用插入符号(^
) . 使用插入符号和括号一起表示黑名单 . 它只会匹配列表中不存在的内容 .https://regex101.com/r/alAZhj/3
图案:
<title>.*?-\s*([^-\s]*)\s*- End<\/title>
这匹配不是连字符或空格的中间连字符之间的任何内容 . 您当然可以使用以下模式修改模式以包含此类字符 .
图案:
<title>.*?-\s*([^-]*)\s*- End<\/title>
这将匹配不是连字符的中间连字符之间的任何内容,以便您可以在那里使用较少的限制文本 .
这将使用负向前瞻来取消
Note
. 可能有一些方法可以优化模式,但我不能自信地这样做,因为我不知道输入字符串的变量 .图案:
/<title>.*?- (?P<title>(?!Note).*?)(?= -|<])/
Demo
我正在使用积极的预测来确保捕获的匹配没有任何不需要的尾随字符 .
如果你只想要第二个最后分隔的值,你可以做这样的事情来返回值作为全字符串匹配:
或者使用捕获组更快:
这假定值中没有连字符 .
我采取了不同的方法,专注于在最后一个词之前返回捕获,而不是任何形式的否定 . 通过这种方式,它非常通用 .
此模式将匹配捕获组中的所需内容:
如果您担心 Headers 标签之间只匹配,那么您可以添加:
Here's a link to the Test
我看到的唯一限制是,它使用单词和空格,所以如果你想要的匹配是“ - 一些短语 - ”那么这将无法使用它,但在你的例子中没有指出 . 它有点不清楚,因为你使用“其他东西”然后“其他东西” .