Javascript regex以排除具有特定属性的标记细节,并仅选择特定标记

Javascript regex以排除具有特定属性的标记细节,并仅选择特定标记,javascript,regex,Javascript,Regex,从下面的标记中,我只想选择一些特定的标记(tagA | tagB)细节,通过使用regex,这些细节没有任何“id”属性 <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

从下面的标记中,我只想选择一些特定的标记(tagA | tagB)细节,通过使用regex,这些细节没有任何“id”属性

<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>
A1B1
A2B2
A3
地下三层
C1/tagC>
A4
B4
C2
A5
B5
C3
A6B6
A7B7
因此,我只能获得以下方面的详细信息:

<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>
A1
地下二层
A4
B4
A5
B5
A6
B7

此正则表达式即使嵌套也会匹配

<(?!.*?\sid=)(.*?)(\s+.*?)?>.*?</\1>
*?
*?
延迟匹配0到多个字符

(?!*?id=)
是一个负前瞻,它检查是否存在id属性,如果存在,则不会进一步匹配

()
中匹配的任何内容都将捕获到
组中

\1
指的是
第一个匹配的组


您可以尝试它

此正则表达式即使嵌套也会匹配

<(?!.*?\sid=)(.*?)(\s+.*?)?>.*?</\1>
*?
*?
延迟匹配0到多个字符

(?!*?id=)
是一个负前瞻,它检查是否存在id属性,如果存在,则不会进一步匹配

()
中匹配的任何内容都将捕获到
组中

\1
指的是
第一个匹配的组

您可以尝试使用regex模式

<(\S+)(?![^<>]*\bid=).*?<\/\1>
使用正则表达式模式

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

以下是我的做法:

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

/以下是我的做法:

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

/非regexp解决方案是否可以接受?使用regexp解析XML通常不是一个好主意,因为XML不是一种常规语言,因此无法使用正则表达式进行解析。有关使用regexps进行XML解析的结果,请参见。话虽如此,对于这种非常有限且定义良好的情况,它可能会像下面的答案一样工作。非regexp解决方案可以接受吗?使用regexp解析XML通常不是一个好主意,因为XML不是一种正则语言,因此无法用正则表达式解析。有关使用regexps进行XML解析的结果,请参见。话虽如此,对于这种非常有限且定义明确的情况,它可能会像下面的答案一样工作。注意嵌套标记:此模式应用于
DellInc。
将只匹配
DellInc。
。是的,这将允许不同的嵌套标记。但是它仍然会在
DellInc.
上中断。那么
text
呢@Ωmega-ur解决方案是最好的..我想删除ans,但不想失去+30代表;)谢谢你的回复。但我在要求上做了一点改变。我已经更新了原始问题…注意嵌套标记:此模式应用于
DellInc。
将只匹配
DellInc。
。是的,这将允许不同的嵌套标记。但是它仍然会在
DellInc.
上中断。那么
text
呢@Ωmega-ur解决方案是最好的..我想删除ans,但不想失去+30代表;)谢谢你的回复。但我在要求上做了一点改变。我已经更新了原来的问题…谢谢你的回复。但我在要求上做了一点改变。我已经更新了原来的问题…@pks-然后继续
谢谢你的回复。但我在要求上做了一点改变。我已经更新了原始问题…@pks-然后继续