【问题标题】:Convert Python re.sub to C#将 Python re.sub 转换为 C#
【发布时间】:2016-01-09 00:17:10
【问题描述】:

我正在尝试从 Python 转换为 C#

   sconvert = re.sub(r"([.$+?{}()\[\]\\])", r"\\\1", sconvert)

我找不到与此功能等效的 C#.Net 来简化它。

来自 Python 手册

re.sub(pattern, repl, string, count=0, flags=0) 返回通过替换最左边不重叠出现的字符串获得的字符串 替换repl在字符串中的模式。如果没有找到该模式, 字符串原样返回。 repl 可以是字符串或函数;如果 它是一个字符串,其中的任何反斜杠转义都会被处理。也就是说,\n 转换为单个换行符,\r 转换为 回车,等等。留下未知的转义符,例如 \j 独自的。反向引用,例如 \6,被替换为子字符串 与模式中的第 6 组匹配。

【问题讨论】:

    标签: c# python regex


    【解决方案1】:

    您正在寻找Regex.Escape method:

    转义最少的字符集(\*+?|{[(^、@987654 $.#空白),将它们替换为它们的转义码。这指示正则表达式引擎按字面意思解释这些字符,而不是元字符。

    sconvert = re.sub(r"([.$+?{}()\[\]\\])", r"\\\1", sconvert) 代码对[.$+?{}()\[\]\\] 范围内指定的字符进行转义,以匹配它们表示的文字字符。

    请注意,Regex.Escape 也会转义空格。如果您不希望这样,请使用您的自定义替换:

    var input = "|^.$+?{}()[]\\-";
    var escaped = Regex.Replace(input, @"[|^.$+?{}()\[\]\\-]", "\\$&");
    Console.Write(escaped);
    // => \|\^\.\$\+\?\{\}\(\)\[\]\\\-
    

    我建议也添加|-^。见IDEONE demo

    【讨论】:

    • 转义函数转义的字符多于我想转义的字符。
    • 是的,所以,请使用您自己的替换代码。我建议也添加|-^。请注意,在 .NET 正则表达式中,您不必转义 {}# 和空格(除非在使用 RegexOptions.IgnorePatternWhitespace 修饰符编译的正则表达式中使用了散列和空格)。
    • 谢谢,正则表达式对我来说太陌生了。
    • 替换可能有点棘手:\\$& 替换为文字 \,整个匹配文本为 $& 是对整个匹配的反向引用(不仅仅是捕获的子匹配)。这是一种快捷方式,以免像在您的模式中那样添加额外的组。在 Python 中,您可以使用\g<0>。见print(re.sub(r"[.$+?{}()\[\]\\]", r"\\\g<0>", '[.$+?{}()[]\\]'))The backreference \g<0> substitutes in the entire substring matched by the RE.
    • 技术上是的,只有 1 条注释:\w 匹配 .NET 中的所有 Unicode 字母和数字。在 Python 中,如果不使用 re.U\w 仅匹配 ASCII 字母和数字。 \d 在这些模式中是多余的,删除它。我不知道你想用这个模式做什么。使用 regex101.com 检查模式的含义。
    猜你喜欢
    • 2017-09-06
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2017-07-16
    • 2017-07-16
    • 1970-01-01
    相关资源
    最近更新 更多