0

a friend of mine is having a problem with regular expressions. He basically has this HTML code:

<a>I don't want this</a>
startString
test1
<a>I want this1</a>
test2
<a>I want this2</a>
endString
gibberish
<a>I don't want this</a>
startString
test1
<a>I want this3</a>
test2
<a>I want this4</a>
endString
gibberish
<a>I don't want this</a>

Like I wrote in the headline, he currently uses 2 regexes to get the "I want this" strings in the code above:

(?<=startString).+?(?=endString)
<a>(.+?)</a>

He now wants to combine these 2 into one regex that does the same. Could anybody explain if this is possible and if it is, how to do it?

Thank you!

4

2 回答 2

0

简短的回答是,只有具有组集合的引擎才能将来自您朋友的两个正则表达式组合成一个正则表达式。我可以想到点网。

检查你的朋友的表达:

 (?<=startString).+?(?=endString)

这得到了第一对和中间的一切,包括不平衡的开始。它应该是'startString(.+?)endString',但仍然是相同的结果。如果他想要互斥对,那就是'startString((?:(?!startString).)+?)endString'。所以你可以看到他放宽了表达式以允许从第一个单端开始多个开始。

仅此一项就阻止了@Jerry 的工作方式。

 <a>(.+?)</a>

下一个单独的表达式将返回 1 个匹配项。例如,它不能像这样使用 '(?:(.+?))+' 并期望累积一个捕获缓冲区 1 的数组它返回 1 个匹配项,其中包含最后一个匹配项的捕获缓冲区 1。除非该语言支持集合(即:Dot-Net)。

在集合的情况下,这两个很容易组合成一个表达式。

总而言之,离开了一段时间,现在又回来了,我仍然对这里不知情的接受答案的程度感到惊讶。

于 2013-09-07T20:36:41.167 回答
0

像这样的模式会起作用(在单行模式下):

(?<=startString.*)<a>(.+?)</a>(?=.*endString)
于 2013-09-07T17:32:08.883 回答