正则表达式排除具有特定属性的标记详细信息,并仅选择特定标记

时间:2012-11-23 13:24:20

标签: javascript regex

从波纹管标签

我想通过使用正则表达式只选择一些没有任何“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>

3 个答案:

答案 0 :(得分:2)

即使它是嵌套的

,这个正则表达式也会匹配
<(?!.*?\sid=)(.*?)(\s+.*?)?>.*?</\1>

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

(?!.*?id=)是一个否定的预测,它会检查是否存在id属性以及它是否会进一步匹配

()

中捕获group内匹配的所有内容

\1指的是first匹配的群组..

您可以尝试here

答案 1 :(得分:1)

使用正则表达式

<(\S+)(?![^<>]*\bid=).*?<\/\1>

答案 2 :(得分:0)

我将如何做到这一点:

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

打破它:

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

  • (?:\s+(?!id=)\w+="[^"]+")*在检查属性的名称不是id

  • 之后,一次消耗一个属性
  • >\w+</\1>完成开始标记,然后使用内容和结束标记

您可能需要调整部分内容,尤其是\w+序列。由于缺乏对数据的熟悉程度,我将其作为占位符进行了调整。