正则表达式匹配标记之间的文本

时间:2011-02-02 19:52:57

标签: c# regex

我需要正则表达式的帮助,因为我对它没有很好的了解。

我有正则表达式:

Regex myregex = new Regex("testValue=\"(.+?)\"");

(。+?)表示什么?

它匹配的字符串是"testValue=123e4567"并返回123e4567作为输出。

现在我需要正则表达式的帮助来匹配字符串"<helpMe>123e4567</helpMe>",我需要123e4567作为输出。我该如何为它编写正则表达式?

3 个答案:

答案 0 :(得分:4)

这意味着:

(   Begin captured group
.   Match any character
+   One or more times
?   Non-greedy quantifier
)   End captured group

对于正则表达式,非贪心量词?表示您捕获的组将在第一次双引号后开始,然后在它遇到的下一个双引号之前结束。如果它是贪婪的(没有?),该组将扩展到它在该行遇到的 last 双引号(即,“贪婪地”消耗尽可能多的行可能的)。

对于“helpMe”示例,您需要此正则表达式:

<helpMe>(.+?)</helpMe>

鉴于此字符串:

<div>Something<helpMe>ABCDE</helpMe></div>

你会得到这场比赛:

ABCDE

非贪婪量词的值在此变体中很明显:

Regex: <helpMe>(.+)</helpMe>
String: <div>Something<helpMe>ABCDE</helpMe><helpMe>FGHIJ</helpMe></div>

贪婪的捕获看起来像这样:

ABCDE</helpMe><helpMe>FGHIJ

有一些有用的互动工具可以使用这些变体:

答案 1 :(得分:2)

关于您的第一个问题,

Ken Redler有一个great answer。对于第二个问题,请尝试:

<(helpMe)>(.*?)</\1>

使用back reference \1,您可以找到匹配标记集之间的值。第一组查找标记名称,第二组匹配内容本身,\1后引用重新使用第一组匹配(在本例中为标记名称)。

此外,在C#中,您可以使用命名组,例如:<(helpMe)>(?<value>.*?)</\1>现在match.Groups["value"].Value包含您的值。

答案 2 :(得分:0)

  

(。+?)表示什么?

这意味着匹配任何字符(。)一次或多次(+?)

匹配第二个字符串的简单正则表达式是

<helpMe>([a-z0-9]+)<\/helpMe>

这将匹配a-zany digit<helpme></helpMe>的任何字符。

pharanteses用于捕获一组。如果您稍后需要引用该组内的值,这将非常有用。