C# 如何使用Regex将[Word]替换为Word。替换并应仅替换整个Word

C# 如何使用Regex将[Word]替换为Word。替换并应仅替换整个Word,c#,C#,我现在正在做一个翻译项目。 我遇到的一个问题是,当我试图用特殊字符替换单词时 例如: [Animal] can be furry. Dog is an [Animal]. 我需要用动物替换[动物]。请注意,我只需要替换整个单词。因此,结果应如下所示: Animal can be furry. Dog is an Animal. 而且,正如我所说的,它应该是整个词。因此,如果我有: [Animal][Animal][Animal]可以是毛茸茸的。-结果仍然应该是毛茸茸的 [Animal][An

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

例如:

[Animal] can be furry.
Dog is an [Animal].
我需要用
动物
替换
[动物]
。请注意,我只需要替换整个单词。因此,结果应如下所示:

Animal can be furry.
Dog is an Animal.
而且,正如我所说的,它应该是整个词。因此,如果我有:

[Animal][Animal][Animal]可以是毛茸茸的。
-结果仍然应该是毛茸茸的

[Animal][Animal][Animal]可能是毛茸茸的。
-由于
[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));
一切都好。但正如我所说的,我需要整个词被替换掉。使用上述代码,“
[动物]可以是毛茸茸的
”将被“
动物可以是毛茸茸的
”取代,这是一个no

所以我也试着:

Regex.Unescape(
 Regex.Replace(
  Regex.Escape(originalText1), 
  String.Format(@"\b{0}\b", Regex.Escape(badText)), 
  Regex.Escape(goodText)))
不过还是不行。现在我迷路了。请帮忙


我还想提到的是,有一篇几乎类似的帖子,但这个问题不需要只替换整个单词。我在网上看了将近3个小时都没有用。非常感谢你的帮助。谢谢

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

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

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

这对我很有用。试试看,告诉我这是不是你想要的

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"
string originalText1=“[Animal]可以是毛茸茸的”;

string badText=@“(?:(?我认为这里最简单的方法是使用“向后看”和“向前看”来确保括号中的文本是“真实的”匹配。我不确定您的确切要求,但您似乎在寻找:

  • 用方括号括起来的搜索字符串(例如
    [Animal]
  • 前面有字符串的开头,或者空白,或者可能有一些点状标记
  • 然后是字符串的结尾,或者空白,或者可能是一些标点符号(例如,
    中后面跟一个句点,Dog是[动物]。
  • 第一个很简单:
    \[Animal\]

    对于第二种情况,您可以使用“向后看”来确保前面的字符是适当的:
    (?对我来说,这很有效:

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

    请允许我“宣传”手头有一个非常有用的链接:)这与问题中给出的任何示例都不匹配,因为“[”和“]”不包含单词边界。这将匹配例如
    a[Animal]a
    ,但不匹配
    [Animal]
    。谢谢大家。这确实有效。但我尽可能不想使用[,如果是其他转义字符会发生什么?这就是为什么我使用Regex.escape.smat!当我有“狗是[动物]。[动物]可能是毛茸茸的。如果[动物]在“,”,“!”之前/之后,它也应该匹配,“,!”,与\b的效果相同。
    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|$|,|\\?|\\.|!|'|\")";