正则表达式问题,跳过未知数量的匹配?

时间:2011-01-20 11:41:41

标签: c# regex string pattern-matching

我正在使用c#,但它基本上不是很重要,我的问题是:它是否可能,只有正则表达式跳过匹配?

我的正则表达式是

Text = Regex.Replace(Text, @"\[code1\]((.|\n)*?)(\<\/span\>) ", "<span class='spanTest'>$1</span>");

但问题是贪婪...总是得到结束时间的第一场比赛

我有一个类似的字符串:

[code1]test string bladibla[code2]code2 string</span> [code3] code3 string [code1]&nbsp; </span></span> end of the span string </span>

我的结局应该是:

<span class="spanTest">test string bladibla[code2]code2 string</span> [code3] code3 string [code1]&nbsp; </span></span> end of the span string </span>

你们有什么建议吗?

2 个答案:

答案 0 :(得分:2)

假设子串以“[code]”开头并以“&lt; / span&gt;”结尾可以互相嵌套,你试图找到匹配的对,答案是否定的。正则表达式与嵌套模式不匹配,这是它们的理论限制之一。 (我知道这不是一个解决方案,但是允许不要在这个特定的墙上撞到你的头。)

答案 1 :(得分:1)

我无法关注你。你的正则表达式肯定是贪婪(*?是一个懒惰的量词),所以它会从[code1]匹配到它找到的最近的</span>,就像在你的示例

但是,它也会与您样本中的第二个[code1]匹配,直到以下</span>。你试图阻止这种行为吗?如果是这样,这两种情况有什么区别?你只想匹配第一次出现,或者你只是想在字符串的开头匹配它,还是......?

最后,如果您指定((.|\n)*?),则可以代替(.*?)而不是RegexOptions.Singleline