【问题标题】:Regex.Replace doesn't seem to work with back-referenceRegex.Replace 似乎不适用于反向引用
【发布时间】:2009-09-18 23:09:45
【问题描述】:

我制作了一个应用程序,旨在使用正则表达式列表准备要翻译的文件。

它使用 Regex.Replace 在文件上运行每个正则表达式。还有一个检查器模块,允许用户查看列表中每个正则表达式的匹配项。

它运行良好,除非正则表达式包含反向引用,Regex.Replace 不会替换任何内容,但检查器会正确显示匹配项(所以我知道正则表达式是有效的并且匹配它应该匹配的内容)。

sSrcRtf = Regex.Replace(sSrcRtf, sTag, sTaggedTag,
  RegexOptions.Compiled | RegexOptions.Singleline);

sSrcRtf 包含页面的 RTF 代码。 sTag 包含括号之间的正则表达式。 sTaggedTag 包含由标签格式代码包围的 $1。

举个例子:

sSrcRtf = Regex.Replace("the little dog", "((e).*?\1)", "$1", 
  RegexOptions.Compiled | RegexOptions.Singleline);

不起作用。但是

sSrcRtf = Regex.Replace("the little dog", "((e).*?e)", "$1", 
  RegexOptions.Compiled | RegexOptions.Singleline);

确实如此。 (当然,1美元左右还有一些RTF代码)

知道这是为什么吗?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    从技术上讲,您在那里有两个匹配组,外括号和内括号。你为什么不尝试将内部集作为第二个捕获,例如:

    ((e).*?\2)
    

    您的解析器可能认为外部捕获是 \1,从内部反向引用它没有多大意义。

    另请注意,您的替换不会做任何事情,因为您要求替换与自身匹配的部分。我不确定您的预期行为是什么,但如果您尝试仅提取匹配项并丢弃字符串的其余部分,您需要类似:

    .*((e).*?\2).*
    

    【讨论】:

    • 谢谢。我没有意识到外圆括号本身也算作反向引用。对于替换,这只是一个示例。在实际代码中,$1 被一些 RTF 代码包围,这些代码根据所需的样式类型生成。我没有发布整篇文章,因为它有点长,可能会分散手头的问题。
    【解决方案2】:

    您正在使用对您所引用组内的组的引用。

    "((e).*?\1)" // first capturing group
    "(e)" // second capturing group
    

    我不能 100% 确定,但我认为您不能从该组中引用该组。对于初学者,您希望反向引用匹配什么,因为它甚至还没有完成?

    【讨论】:

      【解决方案3】:

      正如其他人所提到的,还有一些额外的群体被捕获。您的替换没有引用正确的。

      您当前的正则表达式应重写为(省略选项):

      Regex.Replace("the little dog", @"((e).*?\2)", "$2")
      // or
      Regex.Replace("the little dog", @"(e).*?\1", "$1")
      

      这是另一个匹配双字并指示哪些反向引用有效的示例:

      Regex.Replace("the the little dog", @"\b(\w+)\s+\1\b", "$1")  // good
      Regex.Replace("the the little dog", @"\b((\w+)\s+\2)\b", "$1") // no good
      Regex.Replace("the the little dog", @"\b((\w+)\s+\2)\b", "$2") // good
      

      【讨论】:

        猜你喜欢
        • 2020-04-04
        • 2023-04-06
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多