我尝试用一些字符串(比如说“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
怎么了?
答案 0 :(得分:2)
错误是捕获组阻止您替换parent
的所有实例,因为匹配不能重叠。
然而,你可以做的是使用零宽度匹配,即那些不计入匹配的匹配,为此你需要看似。尝试:
"(?<=[\\.^\"'])" + "parent" +
"(?=[\\.$\"'])",
(?<= ... )
是一个积极的外观,它确保在模式之前有什么内容,
(?= ... )
是一个积极的前瞻,这确保了模式后面的内容。
不计入比赛。
但是,您对模式的解释并不完全正确。 ^
和$
都失去了角色类的功能。你应该使用:
"(?<=[\\.\"']|^)" + "parent" +
"(?=[\\.\"']|$)",
而是指字符串的开头和结尾。现在,您不需要在字符类中转义句点:
"(?<=[.\"']|^)" + "parent" +
"(?=[.\"']|$)",
此外,您的替换现在可以只是blah
,因为除了parent
之外没有其他字符匹配。