不是正则表达式中的单词

时间:2017-08-27 23:08:46

标签: php regex

我试图在模式中的第一个连字符后抓取文本

<title>.*?-(.*?)(-|<\/title>)

然后从下面的模式中抓取DesiredText

<title>Stuff - DesiredText - Other Stuff</title>

但是在这种模式中:

<title>Stuff - Unwanted - DesiredText - Otherstuff</title>

我希望它跳过“不需要的”#39;文本并匹配下一个连字符后的文本(DesiredText)。我制作了一个带有两种模式的regex101,需要修改我的基本正则表达式,这样如果我想要匹配的一个或多个单词存在于capture group中,那么它将匹配第二个连字符文本:

https://regex101.com/r/veSqH3/1

3 个答案:

答案 0 :(得分:0)

这将使用否定前瞻来取消Note的资格。可能有一些方法可以优化模式,但我不能自信地这样做,因为我不知道你的输入字符串是多么变量。

模式:/<title>.*?- (?P<title>(?!Note).*?)(?= -|<])/

Demo

我正在使用正向前瞻以确保捕获的匹配没有任何不需要的尾随字符。

如果您只想要第二个最后分隔的值,您可以执行类似这样的操作以将值作为全字符串匹配返回:

~- \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>

Here's a link to the Test

我看到的唯一限制是它使用单词和空格,所以如果你想要的匹配是“ - 一些短语 - ”那么这将无法使用它,但是在你的例子中没有指出。它有点不清楚,因为你使用“其他东西”然后“其他东西”。