我现在正在做一个翻译项目。我遇到的一个问题是,当我试图替换单词特殊字符时。
例如:
[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个小时都没有用。我们将非常感谢你的帮助。谢谢
我还没有测试过,但我会尝试一下:
Regex.Replace(orginalText, @"b[Animal]b", "Animal");
这只会在单词边界上匹配[动物](\b)
这对我很有用。试试看,告诉我这是否是你想要的。
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 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|$|,|\?|\.|!|'|")";
我认为这里最简单的方法是使用向后看和向前看来确保括号中的文本是"真实"匹配的。我不确定你的确切要求,但看起来你正在寻找:
- 方括号中的搜索字符串(例如
[Animal]
) - 前面是字符串的开头,或空白,或可能是一些标点符号
- 后面跟着字符串的末尾,或者空白,或者可能是一些标点符号(例如,后面跟着
Dog is an [Animal].
中的句点
第一个很简单:[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"