用粗体字/字符串替换单词/字符串

时间:2014-12-09 12:13:01

标签: c# regex string winforms replace

基于此replace multiple words by the same word in bold,我意识到此代码存在问题/限制..

    public string MakeBold(string text, string[] splitwords)
{
    var sb = new StringBuilder();
    var words = text.Split(" ");   
    sb.Append(@"{\rtf1\ansi");
    foreach (var word in words){
      if (splitwords.Contains(word)){
         sb.Append(@"\b"+word+ @"\b0 ");
      }
      else
      {
         sb.Append(word);
         sb.Append(@" ");
      }
    }
    sb.Append(@"}");
    return sb.ToString();
}

使用此行var words = text.Split(" ");我将文本中的所有单词分开,但如果要替换的字符串是:

文字:“我有一个文字,我需要用粗体字加上一些文字”

单词:“有文字”; “黑体”

结果:“我有一个文字,我需要在粗体”中添加一些单词

编辑::

我像这样更新了我的代码

  private string Bold(string text, string[] splitwords)
   {

       StringBuilder builder = new StringBuilder();

       builder.Append(@"{\rtf1\ansi");

       foreach (string word in splitwords)
       {
               if (Regex.IsMatch(text, @"(?<![\w])" + word + @"(?![\w])" ))
           {
               text= text.Replace(word, @"\b " + word + " " + @"\b0");
               }
       }

       builder.Append(text);
       builder.Append(@"}");

       return builder.ToString();
   }

但如果我有文字

文字:“我有一个文字,我需要用粗体字加上一些文字”

单词:“have”; “有文字”; “黑体”

结果:“我 一个文字,我需要在粗体中添加一些单词”

但在另一种情况下它运作正常 HELP ....

2 个答案:

答案 0 :(得分:1)

试试这个:

    public string MakeBold(string text, string[] splitwords)
    {
        string returnValue = text;
        foreach (var word in splitwords)
        {
            returnValue = returnValue.Replace(word, @"\b" + word + @"\b0");
        }
        var finalString = new StringBuilder();
        finalString.Append(@"{\rtf1\ansi");
        finalString.Append(returnValue);
        finalString.Append(@"}");
        return finalString.ToString();
    }

答案 1 :(得分:0)

我们可以检查每个短语的所有出现次数:

StringBuilder builder = new StringBuilder();
string[] words = text.Split(" ");
foreach (string phrase in splitwords)
{
    string[] phrasewords = phrase.Split(" ");
    for (int i = 0; i < words.Length - phrasewords.Length; i++)
    {
        bool match = true;
        for (int j = 0; j < phrasewords.Length; j++)
            if (words[i] != phrasewords[j])
            {
                match = false;
                break;
            }

        if (match)
        {
            builder.Append(@"\b" + phrase + @"\b0 ");
            i += phrasewords.Length - 1;
        }
        else
            builder.Append(words[i] + " ");
    }
}

这不适用于重叠短语,例如“一二”和“二三”。