【问题标题】:Regular Expression with Multiple Possible Replacements具有多种可能替换的正则表达式
【发布时间】:2012-10-22 16:04:41
【问题描述】:

我有一些现有的文本需要替换为替换文本。要使用的替换文本取决于现有文本。这是一个显示我的问题的简单翻译表:

,'A', ==> ,'弗雷德', ,'B', ==> ,'玛丽', ... 等等...

匹配原始文本很容易。我遇到问题的部分是替换文本。如您所见,替换文本取决于匹配的文本:如果找到,'A',,我需要将其替换为,'Fred',。基本上,我似乎需要一个翻译表机制。

我正在使用 .NET RegEx 类。

我了解捕获匹配项并在替换文本中重新使用它们,但我认为这不会奏效。有什么建议吗?

【问题讨论】:

  • I'm using the .NET RegEx classes, although I don't think that matters. --> 这很重要。根据库,可以进行一些操作。
  • 我不熟悉 .NET RegEx 实现,但我记得使用 Perl RegEx 嵌入式函数解决了类似的挑战,我只需用自定义子例程替换并传递匹配的字符串。我的子程序将处理所有规则。也许.NET RegEx 中有类似的东西??

标签: .net regex translation replace


【解决方案1】:

由于您使用的是 .NET,因此有两种方法:

  1. 多次替换:

    string.Replace("A", "Fred");
    string.Replace("B", "Mary");
    // ... (could use regex based replacement if necessary)
    
  2. MatchEvaluator 委托传递给Regex.Replace,而不是替换字符串:

    Regex.Replace(input, matchRegexString, match => {
      // Code that takes a System.Text.RegularExpressions.Match and returns a string
    });
    

    并且委托的返回被用作替换文本。 (还有一个非静态版本,您可以在其中创建 Regex 实例。)过去,我这样做是为了在字典中循环输入中基于 %key% 执行替换。

【讨论】:

  • 请注意,如果一个替换字符串包含稍后搜索的另一个替换字符串,则选项一会出现问题。 (比如 A 被替换为 Bert,然后由于第二行,这将导致 A => Maryert
【解决方案2】:

我相信,在没有多次替换且没有委托/子例程的情况下执行此操作的唯一方法也只有在替换字符串已经存在“稍后”在您的主题字符串中时才有效。

替换这个:

,'A',(?=.*(Fred))|,'B',(?=.*(Mary))

有了这个:

,'$1$2',

是的,一个相当愚蠢的把戏。投票@Richard 为自己的愚蠢行为道歉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2023-03-05
    相关资源
    最近更新 更多