2012-04-18 57 views
3

我试图匹配来自第一个标记<test>的文本内容。RxExp匹配第一个标记

例如:

<test>SAMPLE TEXT</test><test>SAMPLE TEXT2</test><test>SAMPLE TEXT3</test> 

如果我使用

("<test>(.*)</test>")` 

我得到这个:

SAMPLE TEXT</test><test>SAMPLE TEXT2</test><test>SAMPLE TEXT3 

如何让刚刚从第一<test>标签内容:SAMPLE TEXT

+5

看起来像XML。幸运的是,.NET有一些非常优秀,易于使用的XML解析库。为什么不使用它们? – 2012-04-18 13:15:34

+0

是的,我知道..我已经在使用它们。但在这种情况下,我真的需要正则表达式。这是我的例子,只是为了展示我需要什么,但实际上它不是有效的xml。 – 2012-04-18 13:31:55

回答

4

(.*)是贪婪(意为“一切可以匹配,直到找到最后</test>”),你要寻找的非贪婪版本(.*?)(意为“小到可以匹配,直到找到非常第一个</test>“)。

但不要记住the call of Cthulu想着用正则表达式解析HTML时并看看this question了关于使用.NET解析HTML的最佳实践的讨论。或者,如果这是XML(而不是HTML),那么通过一切手段,使用XmlReader以适当(并且容易)的方式进行。

1

而不是.*使用.*?

问号使得星号懒,使其匹配尽可能少。没有它,星号是贪婪的,并且尽可能匹配。 @Radu的

1

答案是非常好的,但也尽量申请审查下列内容:

"<test>([^<]*)</test>" 
+0

那么,这不会匹配<一些其他标签/>'。然后再次,XML解析充满了陷阱。 – rid 2012-04-18 13:20:16

+0

@Radu完全同意。这就是为什么你回答更好。但是,当Ljupco_Sofijanov真的确定只有TEXT是可能的时候,这种情况可能会非常快。 – Dewfy 2012-04-18 13:22:25

1

我同意,你可以使用XML解析库,但无论如何,我会回答:

("<test>([^<]*)</test>") 

会分析与'<'不同的所有字符,这是您要忽略的第一个字符。

HTH。