Regex.Replace忽略非捕获组

时间:2015-06-05 12:51:36

标签: c# .net regex

我有以下代码:

var pattern = @"(?:red).*(\d+)";
var regX = new Regex(pattern);
var input = "this is red with number 111";
var replaced = regX.Replace(input, "666");

然后replacedthis is 666代替:this is red with number 666

为什么会这样?

2 个答案:

答案 0 :(得分:7)

由于正则表达式的(?:red).*部分与字符匹配,因此您需要使用基于正向lookbehind断言的正则表达式。所以在更换时,所有匹配的字符都被替换了。

var pattern = @"(?<=red.*?)\d+";
var regX = new Regex(pattern);
var input = "this is red with number 111";
var replaced = regX.Replace(input, "666");

使用捕获组。

var pattern = @"(red.*?)\d+";

将匹配的字符替换为$1\1 + 666

答案 1 :(得分:1)

您的正则表达式未按预期工作,因为它与getinfo.php匹配。如果你不想匹配数字之前的文本,你可以使用.NET正则表达式中非常棒的变量look-behind:

echo " <td rowspan='10'>

<div>
   <div id='chart-e1'>  
      <canvas id='canvas-e1' ></canvas> 
   </div>
</div>

</td>";

代码:

red with number 111

输出:

enter image description here

请参阅demo (Context tab)

修改

如果要使用捕获组替换,可以使用:

(?<=\bred.*)\d+

替换字符串var pattern = @"(?<=\bred.*)\d+"; var regX = new Regex(pattern); var input = "this is red with number 111"; var replaced = regX.Replace(input,"666"); 中的花括号将确保引擎将其作为组号消除歧义,而不是替换中的数字的一部分。