2012-10-15 37 views
7

我正在翻译项目的工作。 我遇到的一个问题是当我试图替换单词特殊字符时。如何用Word替换[Word]使用Regex.Replace并且应该只替换整个词

例如:

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

回答

1

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

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

这将只匹配[动物]在单词边界(\ B)

+2

让我善意地'广告'[.Net RegExp CheatSheet](http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet)它是非常有用的链接有手边:) – quetzalcoatl

+1

这不符合问题中给出的任何示例,因为'['和']'*不包含单词边界。这将匹配例如'A [动物] A'而不是'[动物]'。 – verdesmarald

+0

谢谢你们。是的,这工作。但尽我所能,我不想使用\ [,如果是其他转义字符会发生什么?这就是我使用Regex.Escape的原因。 – IPPO20jr

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

+0

差不多!当我有“狗是一只[动物]时它失败,[动物]可能是毛茸茸的,如果[动物]在”。“,”,“,”!“之前/之后,它也应该匹配。 。 – IPPO20jr

0

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

  1. 搜索字符串,方括号括起来(如[Animal]
  2. 由字符串的开始,或者在之前的空白,或者可能是一些标点符号。
  3. 其次是字符串或空格,或可能的一些标点符号的端部(例如,随后的周期中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" 
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|$|,|\\?|\\.|!|'|\")";