【问题标题】:Handling regex escape replacement text that contains the dollar character处理包含美元字符的正则表达式转义替换文本
【发布时间】:2023-03-18 00:46:01
【问题描述】:
string input = "Hello World!";
string pattern = "(World|Universe)";
string replacement = "$1";

string result = Regex.Replace(input, pattern, replacement);

有以下示例,结果将是"Hello World!",因为$1 被第一组(World|Universe) 替换,但是我想要的结果是"Hello $1!"

Regex.Escape 方法旨在用于转义正则表达式模式,而不是替换,因为它可以转义其他字符,如斜杠和其他正则表达式模式字符。我的问题的明显解决方法是让我的替换等于"$$1",并将实现"Hello $1!",但我想知道美元符号是否是我必须逃避的唯一值(假设replacement是用户生成的,并且我不提前知道),或者是否有一个辅助函数已经这样做了。

有谁知道一个函数来逃避Regex.Replace(string input, string pattern, string replacement) 使用的替换值?

【问题讨论】:

    标签: c# regex escaping


    【解决方案1】:

    来自MSDN:

    replacement 参数指定要替换input 中每个匹配项的字符串。 替换 可以由文字文本和substitutions 的任意组合组成。

    以下替换are defined:

    • $数字
    • ${姓名}
    • $$
    • $&
    • $`
    • $'
    • $+
    • $_

    替换是替换模式中唯一可以识别的特殊结构。不支持任何其他正则表达式语言元素,包括字符转义和匹配任何字符的句点 (.)。同样,替换语言元素仅在替换模式中被识别,并且在正则表达式模式中永远无效。

    所以看起来只有 $ 字符需要转义。

    【讨论】:

    • 另外来自 MSDN:替换是唯一可以在替换模式中识别的正则表达式语言元素。所有其他正则表达式语言元素,包括字符转义,仅允许在正则表达式模式中使用,并且在替换模式中不被识别。
    • 这对我来说已经足够好了,我怀疑做一个愚蠢的 ol' replacement.Replace("$", "$$") 应该在 100% 的时间里都很好?
    • 是的,replacement.Replace("$", "$$") 应该是你所需要的。
    • 感谢您的回答。也许,我们创建一个字符串扩展方法(如public string EscapeRegexReplacement(this string replacement) { return replacement.Replace("$", "$$"); })并将其保存在我们解决方案的全局实用程序项目中的某个位置,以便在需要时可以重用它也是有意义的。也感觉微软应该在 Regex 类本身中包含一个静态函数,就像他们有 Regex.Escape 一样。
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2013-04-03
    相关资源
    最近更新 更多