C#正则表达式取代了意外行为

时间:2009-01-22 14:55:52

标签: c# .net regex

给定$displayHeight = "800";,将800处的任何数字替换为int值y_res

resultString = Regex.Replace(
    im_cfg_contents, 
    @"\$displayHeight[\s]*=[\s]*""(.*)"";", 
    Convert.ToString(y_res));

在Python中我会使用re.sub,它会起作用。在.NET中,它取代了整行,而不是匹配的组。

什么是快速解决方法?

5 个答案:

答案 0 :(得分:2)

基于已发布的几个答案。零宽度断言允许您进行正则表达式匹配,而无需将这些字符放在匹配中。通过将字符串的第一部分放在一个组中,我们将它与您要替换的数字分开。然后通过在该组中使用零宽度lookbehind断言,我们允许正则表达式正常进行但省略匹配中该组中的字符。类似地,我们将字符串的最后一部分放在一个组中,并使用零宽度前瞻断言。 Grouping Constructs on MSDN显示组和断言。

resultString = Regex.Replace(
    im_cfg_contents, 
    @"(?<=\$displayHeight[\s]*=[\s]*"")(.*)(?="";)", 
    Convert.ToString(y_res));

另一种方法是使用以下代码。对正则表达式的修改只是将第一部分放在一个组中,将最后一部分放在一个组中。然后在替换字符串中,我们在第一组和第三组中添加。不如第一种方法好,但不如写出$ displayHeight部分那么糟糕。 Substitutions on MSDN显示$字符的工作方式。

resultString = Regex.Replace(
    im_cfg_contents, 
    @"(\$displayHeight[\s]*=[\s]*"")(.*)("";)", 
    "${1}" + Convert.ToString(y_res) + "${3}");

答案 1 :(得分:0)

试试这个:

resultString = Regex.Replace(
    im_cfg_contents,
    @"\$displayHeight[\s]*=[\s]*""(.*)"";",
    @"\$displayHeight = """ + Convert.ToString(y_res) + @""";");

答案 2 :(得分:0)

你也可以试试这个,虽然我认为它比我的其他方法慢一点:

resultString = Regex.Replace(
    im_cfg_contents,
    "(?<=\\$displayHeight[\\s]*=[\\s]*\").*(?=\";)",
    Convert.ToString(y_res));

答案 3 :(得分:0)

它替换了整个字符串,因为你已匹配整个字符串 - 这个语句没有告诉C#只替换匹配的组,它会找到并存储匹配的组,但它仍然匹配整个字符串。< / p>

您可以将替换者更改为:

@"\$displayHeight = """ + Convert.ToString(y_res) + @""";"

..或者你可以改变你的模式以匹配数字,即:

@"[0-9]+"

..或者您可以看到C#正则表达式是否支持外观(我不确定它是否随意)并相应地更改您的匹配。

答案 4 :(得分:0)

检查此模式

(?<=(\$displayHeight\s*=\s*"))\d+(?=";)

关于“lookaround”的一句话。