0

我尝试替换在某些字符串(比如“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

怎么了?

4

1 回答 1

2

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

但是,您可以做的是使用零宽度匹配,即那些不计入匹配的匹配,为此您需要环顾四周。尝试:

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

(?<= ... )是一个积极的向后看,它确保在模式之前有什么,

(?= ... )是一个积极的前瞻,它确保在模式之后有什么。

两者都不计入比赛。

但是,您对模式的解释并不完全正确。两者都^失去$了它们在字符类中的功能。你应该使用:

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

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

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

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

于 2013-10-05T17:10:43.507 回答