【问题标题】:How to Replace [Word] with Word using Regex.Replace and should replace whole word only如何使用 Regex.Replace 将 [Word] 替换为 Word,并且应仅替换整个单词
【发布时间】:2012-10-15 11:54:23
【问题描述】:

我现在正在处理一个翻译项目。 我遇到的问题之一是当我尝试替换单词特殊字符时。

例如:

[Animal] can be furry.
Dog is an [Animal].

我需要将[Animal] 替换为Animal。请注意,我只需要替换整个单词。所以结果应该如下:

Animal can be furry.
Dog is an Animal.

另外,正如我所说,它应该是整个词。所以如果我有:

[Animal][Animal][Animal] can be furry. - 结果应该仍然是

[Animal][Animal][Animal] can be furry. - 什么都没发生,因为[Animal][Animal][Animal][Animal] 不一样

示例:

string originalText1 = "[Animal] can be furry";
string badText ="[Animal]";
string goodText = "Animal";

Regex.Replace(originalText1,  Regex.Escape(badText), Regex.Escape(goodText));

一切正常。但正如我所说,我需要替换整个词。使用上面的代码,“[Animal]can be furry”将被替换为“Animalcan be furry”,这是一个否号。

所以我也试过了:

Regex.Unescape(
 Regex.Replace(
  Regex.Escape(originalText1), 
  String.Format(@"\b{0}\b", Regex.Escape(badText)), 
  Regex.Escape(goodText)))

虽然还是不行。现在我迷路了。请帮忙。

我还想提一下,几乎有一个类似的帖子,但这个问题不需要只替换整个单词。我已经在网上查看了将近 3 个小时,但无济于事。对你的帮助表示感谢。谢谢!

【问题讨论】:

    标签: c#


    【解决方案1】:

    我没有测试过,但我会试试这个:

    Regex.Replace(orginalText, @"\b\[Animal\]\b", "Animal");
    

    这只会在单词边界处匹配 [Animal] (\b)

    【讨论】:

    • 请允许我“宣传”.Net RegExp CheatSheet,这是非常有用的链接:)
    • 这与问题中给出的任何示例都不匹配,因为 ' [' 和 '] ' 包含单词边界。例如,这将匹配 A[Animal]A 但不匹配 [Animal]
    • 谢谢你们。是的,那行得通。但尽我所能,我不想使用 [,如果它是其他转义字符会发生什么?这就是我使用 Regex.Escape 的原因。
    【解决方案2】:

    这对我有用。试试看,如果它是你要找的,请告诉我。

    string originalText1 = "[Animal] can be furry";
    string badText = @"(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))" + Regex.Escape("[Animal]") + @"(?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))";
    string goodText = "Animal";
    string newString = Regex.Replace(originalText1, badText, goodText);
    Console.WriteLine(newString);
    //"Animal can be furry"
    
    originalText1 = "[Animal]can be furry";
    newString = Regex.Replace(originalText1, badText, goodText);
    Console.WriteLine(newString);
    //"[Animal]can be furry"
    

    找到here

    【讨论】:

    • 几乎!当我有“Dog is an [Animal].[Animal] 可以是毛茸茸的。如果 [Animal] 在“.”、“”、“!”之前/之后,它也应该匹配,与 \b 的效果相同.
    【解决方案3】:

    对我来说这是可行的:

    string s = @"[Animal][Animal][Animal] can be furry. - nothing happened as [Animal] is not the same as [Animal][Animal][Animal]
    [Animal] can be furry.
    [Animal]
    can [Animal]
    be furry
    my [Animal] is furry";
    string mask = "(^|\\s)\\[Animal\\](\\s|$)";
    string rep = "$1Animal$2";
    string s2 = "";
    s2 = Regex.Replace(mask, rep);
    
    /*
    s2 = "[Animal][Animal][Animal] can be furry. - nothing happened as Animal is not the same as [Animal][Animal][Animal]
    Animal can be furry.
    Animal
    can Animal
    be furry
    my Animal is furry" */
    

    您还可以在掩码中添加“特殊字符”:

    string mask = "(^|\\s|'|\")\\[Animal\\](\\s|$|,|\\?|\\.|!|'|\")";
    

    【讨论】:

      【解决方案4】:

      我认为这里最简单的方法是使用后视和前瞻来确保括号内的文本是“真正的”匹配。我不确定您的确切要求,但您似乎正在寻找:

      1. 搜索字符串,括在方括号中(例如[Animal]
      2. 前面是字符串的开头,或者空格,或者可能是一些标点符号。
      3. 后跟字符串的结尾,或空格,或者可能是一些标点符号(例如,后跟Dog is an [Animal]. 中的句点

      第一个很简单:\[Animal\]

      第二个你可以使用look-behind来确保前面的字符是合适的:
      (?&lt;=(^|\s)),最后一个look-ahead:(?=($|\s|\.))

      这意味着整个正则表达式将是:

      var pattern = @"(?<=^|\s)\[Animal\](?=$|\s|\.)";
      var output = Regex.Replace(input, pattern, "Animal");
      

      您可能需要根据需要在前瞻/后视中添加额外的标点符号。

      对于您问题中的示例:

      Input: "[Animal] can be furry."
      Output: "Animal can be furry."
      
      Input: "Dog is an [Animal]."
      Output: "Dog is an Animal."
      
      Input: "[Animal][Animal][Animal] can be furry."
      Output: "[Animal][Animal][Animal] can be furry."
      
      Input: "[Animal]can be furry"
      Output: "[Animal]can be furry"
      

      【讨论】:

        猜你喜欢
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多