如何使用Regex.Replace用Word替换[Word]并且应该仅替换整个单词

时间:2012-10-15 11:54:23

标签: c#

我正在做一个翻译项目。 我遇到的一个问题是当我试图替换单词特殊字符时。

例如:

[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个小时都无济于事。对你的帮助表示感谢。谢谢!

4 个答案:

答案 0 :(得分:1)

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

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

这只会在字边界(\ b)

上匹配[动物]

答案 1 :(得分:0)

这对我有用。尝试一下,如果你正在寻找它,请告诉我。

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

答案 2 :(得分:0)

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

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

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

    对于第二个,你可以使用一个后视来确保前面的字符是合适的:
    (?<=(^|\s)),最后一个前瞻:(?=($|\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"
    

答案 3 :(得分:0)

对我而言,这有效:

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|$|,|\\?|\\.|!|'|\")";