2009-11-17 94 views
1

我试图找到一个id和文本的所有标签,但我的正则表达式似乎不工作:正则表达式查找标签

用下面的正则表达式:

<asp:[a-z]+.*? ID="(?<id>.*?)".*? Text="(?<text>.*?)".*?/> 

及以下示例文本:

<asp:Label ID="SomeID" Text="SomeText" /> 
<asp:Label Text="SomeText" /> 
<asp:Label ID="SomeID" /> 
<asp:Label ID="SomeOtherID" Text="Some Other Text" /> 

我碰到下面的比赛:

1. "<asp:Label ID="SomeID" Text="SomeText" />" has 2 groups: 
     1. "SomeID" 
     2. "SomeText" 
    2. "<asp:Label Text="SomeText" /> <asp:Label ID="SomeID" /> <asp:Label ID="SomeOtherID" Text="Some Other Text" />" has 2 groups: 
     1. "SomeID" 
     2. "Some Other Text" 

第一个显然是正确的,但我不知道为什么#2出现。

而下面的正则表达式唯一发现的第一个标签(“SomeID”),而不是第四个(“SomeOtherID”):

<asp:[a-z]+ (?!.*<[a-z]).*? ID="(?<id>.*?)".*? Text="(?<text>.*?)".*?/> 
+2

这里有一个良好的措辞解释! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Andomar 2009-11-17 15:57:36

+0

你为什么要在你的应用程序中搜索你的代码?当然有更好的方法来做到这一点? – 2009-11-17 15:57:42

+0

也许他不是在他的应用程序中搜索他的代码,而是在他的编辑器中搜索他的代码?有围绕正则表达式支持的IDE ... – Heinzi 2009-11-17 16:04:27

回答

2

尝试在你的表达[^>]*更换.* S,以避免交叉HTML标签边界。问题在于表达式中间的.*?/> <asp:Label ID="SomeOtherID"匹配。

也许是这样的:

<asp:[a-z]+\s*ID="(?<id>[^"]*)"\s*Text="(?<text>[^"]*)"[^/]*/> 
+1

正如一个额外的帮助,寻找“>>>><<<<”: 。*?)”>>>>。*?<<<< Text =“(?。*?)”。*?/ – 2009-11-17 16:05:31

+0

谢谢 - 你的正则表达式提供了一个很好的起点。 :-) – Sadhana 2009-11-17 16:39:46