如何使用编号组进行正则表达式替换?

时间:2009-05-07 13:38:27

标签: regex

我正在尝试替换所有字符串实例,例如

PageLocalize("Texts", "R73")

类似

Texts.R73.Localise()

我有匹配这些字符串的正则表达式:

PageLocalize\("([A-Za-z]+)", "([A-Za-z0-9]{0,6})"\)

替换字符串:

$1.$2.Localise()

但是The Regex Coach说我的替换结果是

$1.$2.Localise()

我需要对正则表达式做些什么才能使编号分组正常工作?

2 个答案:

答案 0 :(得分:2)

它在测试应用程序中运行良好:

var r = new Regex(
    "PageLocalize\\(\"([A-Za-z]+)\", \"([A-Za-z0-9]{0,6})\"\\)");
var s = r.Replace("PageLocalize(\"Texts\", \"R73\")", "$1.$2.Localise()");
Console.WriteLine(s);

这导致:

Texts.R73.Localise()

AmitK在Regex Coach中找到了正确的方法,它使用\ 1代替$ 1。事实证明RegexCoach不是.NET应用程序,所以它不使用.NET正则表达式!

另外,你知道named groups吗?它们更易于维护,尤其是在向正则表达式添加新组时。无法让Stackoverflow显示没有空格的命名组正则表达式,所以这里有空格:

(?< group_name> yourregex)

在替换文字中:

${group_name}

答案 1 :(得分:2)

我没有使用过RegexCoach,但是一些Regex引擎要求你用反斜杠指定反向引用,如下所示:

\1.\2.Localise()

只有在$ 1不被视为对第1组的反向引用时,才能获得您获得的结果。

修改

我刚检查过,RegexCoach似乎使用了Perl Regex语法。如果是这样,那么$1将是对组1的有效反向引用。那么看起来引擎无法匹配组。