使用regexpression C#替换序列

时间:2013-10-05 17:01:48

标签: c# regex

我尝试用一​​些字符串(比如说“blah”)替换每个用点(在两边)分隔的“父”。即用于字符串

$view.parent.parent.data.CurrentCategoryId, $view.parent.parent.data.CurrentFolderId

我需要字符串

$view.blah.blah.data.CurrentCategoryId, $view.blah.blah.data.CurrentFolderId

我尝试用代码

执行此操作
content = Regex.Replace(content,
                                        "(?<preSymbol>[\\.^\"'])" + "parent" +
                                        "(?<postSymbol>[\\.$\"'])",
                                        m =>
                                        m.Groups["preSymbol"] + "blah" +
                                        m.Groups["postSymbol"]);

但是

view.blah.parent.data.CurrentCategoryId, $view.blah.parent.data.CurrentFolderId

怎么了?

1 个答案:

答案 0 :(得分:2)

错误是捕获组阻止您替换parent的所有实例,因为匹配不能重叠。

然而,你可以做的是使用零宽度匹配,即那些不计入匹配的匹配,为此你需要看似。尝试:

"(?<=[\\.^\"'])" + "parent" +
"(?=[\\.$\"'])",

(?<= ... )是一个积极的外观,它确保在模式之前有什么内容,

(?= ... )是一个积极的前瞻,这确保了模式后面的内容。

不计入比赛。

但是,您对模式的解释并不完全正确。 ^$都失去了角色类的功能。你应该使用:

"(?<=[\\.\"']|^)" + "parent" +
"(?=[\\.\"']|$)",

而是指字符串的开头和结尾。现在,您不需要在字符类中转义句点:

"(?<=[.\"']|^)" + "parent" +
"(?=[.\"']|$)",

此外,您的替换现在可以只是blah,因为除了parent之外没有其他字符匹配。