代码之家  ›  专栏  ›  技术社区  ›  Dustin Getz sunsations

c regex替换意外行为

  •  2
  • Dustin Getz sunsations  · 技术社区  · 16 年前

    鉴于 $displayHeight = "800"; ,替换任何数字 800 带int值 y_res .

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

    在python中,我将使用re.sub,它将起作用。在.NET中,它将替换整行,而不是匹配的组。

    什么是快速修复?

    5 回复  |  直到 14 年前
        1
  •  2
  •   vengafoo    16 年前

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

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

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

    resultString = Regex.Replace(
        im_cfg_contents, 
        @"(\$displayHeight[\s]*=[\s]*"")(.*)("";)", 
        "${1}" + Convert.ToString(y_res) + "${3}");
    
        2
  •  0
  •   Martin Brown    16 年前

    试试这个:

    resultString = Regex.Replace(
        im_cfg_contents,
        @"\$displayHeight[\s]*=[\s]*""(.*)"";",
        @"\$displayHeight = """ + Convert.ToString(y_res) + @""";");
    
        3
  •  0
  •   annakata    16 年前

    它替换了整个字符串,因为您已经匹配了整个字符串——关于这个语句,没有任何内容告诉C只替换匹配的组,它将确定找到并存储匹配的组,但它仍然匹配整个字符串。

    您可以将替换器更改为:

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

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

    @"[0-9]+"
    

    …或者你可以看看C regex是否支持查找(我不确定它是否是现成的),并相应地更改你的匹配。

        4
  •  0
  •   Martin Brown    16 年前

    您也可以尝试这个方法,尽管我认为它比我的其他方法慢一点:

    resultString = Regex.Replace(
        im_cfg_contents,
        "(?<=\\$displayHeight[\\s]*=[\\s]*\").*(?=\";)",
        Convert.ToString(y_res));
    
        5
  •  0
  •   Thuglife    16 年前

    看看这个图案

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

    关于“ lookaround “。