0

从下面的标签中,我只想使用正则表达式选择一些没有任何“id”属性的特定标签(tagA|tagB)详细信息。

<span class="online"><tagA xmlns="http://www.xyz.com/xml/ja/dtd">A1</tagA><tagB id="tg1" xmlns="http://www.xyz.com/xml/ja/dtd">B1</tagB></span>
<span class="online"><tagA id="tg2" xmlns="http://www.xyz.com/xml/ja/dtd">A2</tagA><tagB xmlns="http://www.xyz.com/xml/ja/dtd">B2</tagB></span>
<tagA id="tg3" xmlns="http://www.xyz.com/xml/ja/dtd">A3</tagA>
<tagB id="tg4" xmlns="http://www.xyz.com/xml/ja/dtd">B3</tagB>
<tagC id="tg5" xmlns="http://www.xyz.com/xml/ja/dtd">C1/tagC>
<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A4</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B4</tagB>
<tagC xmlns="http://www.xyz.com/xml/ja/dtd">C2</tagC>
<tagA>A5</tagA>
<tagB>B5</tagB>
<tagC>C3</tagC>
<span class="online"><i><tagA xmlns="http://www.xyz.com/xml/ja/dtd">A6</tagA></i><b><tagB id="tg6" xmlns="http://www.xyz.com/xml/ja/dtd">B6</tagB></b></span>
<span class="online"><i><tagA id="tg7" xmlns="http://www.xyz.com/xml/ja/dtd">A7</tagA></i><b><tagB xmlns="http://www.xyz.com/xml/ja/dtd">B7</tagB></b></span>

因此,我应该只获得以下详细信息:

<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A1</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B2</tagB>

<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A4</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B4</tagB>
<tagA>A5</tagA>
<tagB>B5</tagB>

<tagA xmlns="http://www.xyz.com/xml/ja/dtd">A6</tagA>
<tagB xmlns="http://www.xyz.com/xml/ja/dtd">B7</tagB>
4

3 回答 3

2

即使它是嵌套的,这个正则表达式也会匹配

<(?!.*?\sid=)(.*?)(\s+.*?)?>.*?</\1>

.*?懒惰地匹配 0 到多个字符

(?!.*?id=)是一个否定的前瞻,检查是否有一个 id 属性,如果它不会进一步匹配

任何匹配的内容都()被捕获在group

\1first匹配组..

你可以在这里试试

于 2012-11-23T13:26:38.453 回答
1

使用正则表达式模式

<(\S+)(?![^<>]*\bid=).*?<\/\1>
于 2012-11-23T13:51:34.267 回答
0

这是我的做法:

/<(tag[A-Z]+)(?:\s+(?!id=)\w+="[^"]+")*>\w+<\/\1>/i

分解它:

  • <(tag[A-Z]+)匹配开始标签并在组 #1 中捕获其名称

  • (?:\s+(?!id=)\w+="[^"]+")*在检查属性的名称不是之后,一次使用一个属性id

  • >\w+</\1>完成开始标签,然后使用内容和结束标签

您可能需要调整其中的一部分,尤其是\w+序列。由于对您的数据不熟悉,我把它们扔进去作为占位符。

于 2012-11-26T11:29:34.233 回答