只替换整个单词c#

时间:2016-08-09 23:57:13

标签: c#

我正在尝试创建一个仅替换整个单词的函数,例如:

句子:“#testing是#test”,如果我使用Replace(“#test”,“#cool”),我会“#cooling if #cool”但我想要“#”测试是#cool“

我搜索过,发现每个答案都是:

string pattern = @"\b"+previousText+"\b";
string myText = Regex.Replace(input, pattern, newText, RegexOptions.IgnoreCase);

但是,如果我的previousText(我要替换的那个)包含“#”,则此解决方案不起作用。

我的previousText和newText都可以以“#”开头。

这是什么解决方案?

编辑:感谢Legends,如果单词后跟空格,则正则表达式现在有效,但如果搜索到的单词位于逗号旁边则会失败:

string input = "#test, #test";
            string patternTest = @"#test";
            string newTextTest = "#cool";
            string result = Regex.Replace(input, @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))" + patternTest + @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))", newTextTest, RegexOptions.IgnoreCase);

返回:“#test,#cool”而不是“#cool,#cool”

2 个答案:

答案 0 :(得分:2)

以下正则表达式只会替换单个整词

var input = "#testing is #test";
var pattern = @"#test";
string myText = 
Regex.Replace(input, @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))" + pattern + @"(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))","#cool", RegexOptions.IgnoreCase);


结果:

  

#testing是#cool

这应该直接在单词之前和之后使用逗号和分号:

var input = "#test, is ;#test";
var searchString = @"#test";
var replaceWith = "#cool";
var pattern = @"(?:(?<=^|(\s|,|;))(?=\S|$)|(?<=^|\S)(?=\s|$))" 
              + searchString + 
              @"(?:(?<=^|(\s))(?=\S|$)|(?<=^|\S)(?=(\s|,|;)|$))";

string myText = Regex.Replace(input, pattern, replaceWith, RegexOptions.IgnoreCase);

<强>结果:

  

#cool,is; #cool

<小时/> 此单词将在单词之前和之后使用以下所有字符

例如:

  1. ,字或词,
  2. 字;或;字
  3. .word或....
  4.   

    ,; 。 - &#39;

    var input = "#test's is #test.";
    var searchString = @"#test";
    var replaceWith = "#cool";
    var pattern = @"(?:(?<=^|(\s|,|;|-|:|\.|'))(?=\S|$)|(?<=^|\S)(?=\s|$))" 
                  + searchString + 
                  @"(?:(?<=^|(\s))(?=\S|$)|(?<=^|\S)(?=(\s|,|;|-|:|\.|')|$))";
    string myText = Regex.Replace(input,pattern ,replaceWith, RegexOptions.IgnoreCase);
    

    <强>结果:

      

    #cool&#39; s是#cool。

答案 1 :(得分:1)

如果您出于某种原因不想使用正则表达式,那么您也可以在没有它的情况下使用正则表达式:

var split_options = new [] {' ', '.', ',' ...}; // Use whatever you might have here.
var input =  "#testing is #test".Split( split_options
                                      , StringSplitOptions.RemoveEmptyEntries);
var word_to_replace = "#test";
var new_text = "#cool";
for (int i = 0; i < input.Length; i++)
{
    if (input[i].Equals(word_to_replace))
    input[i] = new_text;
}
var output = string.Join(" ",input);

// your output is "#testing is #cool"

你可以将它放在方法或扩展方法中,它也会使你的代码更清晰。