我的一个朋友正在使用正则表达式。他基本上有这个HTML 代码:
<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>
就像我在标题中写的那样,他目前使用2个正则表达式来获取上面代码中的“我想要这个”字符串:
(?<=startString).+?(?=endString)
<a>(.+?)</a>
他现在想把这两个组合成一个同样的正则表达式。任何人都可以解释这是否可能,如果是,怎么做?
谢谢!
答案 0 :(得分:0)
这样的模式可以工作(在单行模式下):
(?<=startString.*)<a>(.+?)</a>(?=.*endString)
答案 1 :(得分:0)
简短的回答是,只有拥有群组集合的引擎才能将您朋友的两个正则表达式合并为一个正则表达式。我能想到Dot-Net。
检查你的朋友表情:
(?<=startString).+?(?=endString)
这会得到第一对和中间的一切,包括不平衡的开始。 它应该是'startString(。+?)endString',但仍然是相同的结果。 如果他想要相互排斥对,那本来就是 'startString((?:(?!startString)。)+?)endString'。所以你可以看到他放松了表达 允许第一个单端的多次启动。
仅此一点就可以预防@Jerry的工作方式。
<a>(.+?)</a>
作为独立的下一个表达式将返回1个匹配。例如,它无法使用 像这样'(?:(。+?))+'并期望累积一个捕获缓冲区1的数组 它返回包含最后一个匹配的捕获缓冲区1的1个匹配项。 这是除非语言支持集合(即:Dot-Net)。
对于集合,这两个很容易组合成一个表达式。
总而言之,已经离开一段时间而现在又回来了,它仍然让我感到惊讶 在这里不知情地接受答案。