0

我想要一个正则表达式来找出特定的 html 标签详细信息。

我尝试了以下 2 正则表达式:

<\s*tag[^>]*>(.*?)<\s*/\s*tag>

<tag[^<>]*>.+?<\/tag>

下面是第一个正则表达式的2 个测试用例

第一个示例中,我得到了正确的结果,但在示例 2中,我得到了错误的结果。在这两种情况下,输入几乎相同。

第一种情况:全部作为单个字符串,第二种情况:作为单个字符串

===================================
Example 1 Input
===================================
<tagX>AAA</tagX>
<tag>GGG</tag>
<tag id="tag896">HHH</tag>
<tagY>III</tagY>
<tag id="tag017">JJJ</tag>
<tag>KKK</tag>
===================================
Output 1 // Correct
===================================
<tag>GGG</tag>
GGG
<tag id="tag896">HHH</tag>
HHH
<tag id="tag017">JJJ</tag>
JJJ
<tag>KKK</tag>
KKK


===================================
Example 2 Input (as a single string)
===================================
<tagX>AAA</tagX><tag>GGG</tag><tag id="tag896">HHH</tag><tagY>III</tagY><tag id="tag017">JJJ</tag><tag>KKK</tag>
===================================
Output 2 // Wrong
===================================
<tagX>AAA</tagX><tag>GGG</tag>
AAA</tagX><tag>GGG

<tag id="tag896">HHH</tag>
HHH

<tagY>III</tagY><tag id="tag017">JJJ</tag>
III</tagY><tag id="tag017">JJJ

<tag>KKK</tag>
KKK

这里正是我想要(tag)的详细信息,但在第二种情况下,它获取(tag) + (tagX) + (tagY) 的详细信息。

我的输入类似于第二输入...

它的小紧急......我能得到一个解决方案吗?

谢谢...

4

3 回答 3

1

我尝试了下面的正则表达式,它工作正常......

<tag( [^<>]+)?>(.+?)<\/tag>
于 2013-08-07T12:38:28.370 回答
1

您编写的正则表达式中的问题是,<tagX>如果有 `' 应该在同一行将其关闭,则您允许(例如)成为开始标签。

在这种情况下,您使用正则表达式的问题是,如果 XML 是,您可能会得到不好的结果:

<tag></tag>
<tagX></tagX>
<tag></tag>

如果所有的标签都是内联的,你可以得到整个东西,所以要非常小心。

我会使用类似的东西(这适用于上面的例子):

 <\s*tag((\s+[^<>]+\s*>)|(\s*>))[^<>]*<\s*\/tag\s*>

在这里,我允许所有有效的空格,但我不允许嵌套标签,所以上面的例子可以工作。此外,如果您允许嵌套标签,则没有 REGEX 将起作用。看这个例子:

<tag> <tagX> <tag> </tag> </tagX> </tag>

虽然,在这个例子中,你会得到<tag> <tagX> <tag> </tag>一个有效的答案。

于 2013-08-07T12:02:04.520 回答
0

如果您使用的是 .NET(并且由于某种原因,您确信您的 XML 并且不需要使用Html Agility Pack),您可以试试这个:

<tag(?:>|(?: .*?>))(.*?)</tag>
于 2013-08-07T12:21:22.483 回答