我正在使用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] </span></span> end of the span string </span>
我的结局应该是:
<span class="spanTest">test string bladibla[code2]code2 string</span> [code3] code3 string [code1] </span></span> end of the span string </span>
你们有什么建议吗?
答案 0 :(得分:2)
假设子串以“[code]”开头并以“&lt; / span&gt;”结尾可以互相嵌套,你试图找到匹配的对,答案是否定的。正则表达式与嵌套模式不匹配,这是它们的理论限制之一。 (我知道这不是一个解决方案,但是允许不要在这个特定的墙上撞到你的头。)
答案 1 :(得分:1)
我无法关注你。你的正则表达式肯定是不贪婪(*?
是一个懒惰的量词),所以它会从[code1]
匹配到它找到的最近的</span>
,就像在你的示例
但是,它也会与您样本中的第二个[code1]
匹配,直到以下</span>
。你试图阻止这种行为吗?如果是这样,这两种情况有什么区别?你只想匹配第一次出现,或者你只是想在字符串的开头匹配它,还是......?
最后,如果您指定((.|\n)*?)
,则可以代替(.*?)
而不是RegexOptions.Singleline
。