如何使用RegEx提取最里面的一对标签?

时间:2014-07-11 13:30:54

标签: regex regex-negation

我需要从HTML表中提取一行,其中包含一些子串XXX

<some html>
<tr rn="1"...AAA...</tr><tr rn="2"...XXX...</tr><tr rn="3"...ZZZ...</tr>
<some html>

...可能包含tr和其他元素的属性,但不能包含其他<tr>标记。周围的HTML代码包含其他表,但它们在rn之后没有<tr>属性。我需要获取行的整个HTML代码,特别是rn的值:

Match 1: <tr rn="2" XXX </tr>
Match 2: 2

显然这个RE工作不正确,导致它也提取第一行:

(<tr rn=\"(\d+)\".*XXX.*?tr>)

我尝试以这种方式添加否定前瞻:

(<tr rn(?!<tr rn)=\"(\d+)\".*XXX.*?tr>)
(<tr rn((?!<tr rn).)*=\"(\d+)\".*XXX.*?tr>)

但他们的工作也不正确。 我该怎么做?

1 个答案:

答案 0 :(得分:1)

我不知道这是否是最有效的方法,但这应该有效:

(<tr rn=\"(\d+)\"(?:(?!tr>).)*?XXX.*?tr>)

基本上,你要添加一个非捕获组,说明任何不是tr> 的东西(你的结束标记),尽可能少重复,直到找到{{1 }}

希望有意义