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