【问题标题】:find the index of all matching search string in a given string and then insert a new word在给定字符串中找到所有匹配搜索字符串的索引,然后插入一个新单词
【发布时间】:2014-10-30 10:34:04
【问题描述】:

我有一个字符串,例如:

为了减少每天的香烟消费量,德里大学的学生 Vineet 已经开始抽更长的香烟。香烟对健康有不良影响

必须找到香烟的出现并在其前插入<span style='color: red;'> 以突出显示?

string search = "cigaret";
string lbltxt = Label1.Text;

int startIndex = Label1.Text.IndexOf(search,StringComparison.CurrentCultureIgnoreCase);
int endIndex = Label1.Text.IndexOf(search,StringComparison.CurrentCultureIgnoreCase) +  (search.Length);
Label1.Text = Label1.Text.Insert(endIndex, "</span>");
Label1.Text = Label1.Text.Insert(findIndex, "<span style='color: red;'>");

这段代码只找到第一次出现并在原始字符串中只突出显示一次而不是三次。

【问题讨论】:

标签: c# asp.net


【解决方案1】:

使用这个 JQUERY

   $("p").html(function(index, value) {
    return value.replace(/\b(cigarette)\b/g, '<strong class="test">$1</strong>');
});

还有一个CSS

   .test {
    color: #ff0000;
}

通过这个小提琴 http://jsfiddle.net/EGtBy/218/

我认为这是一种既简单又安全的工作方式。

您可以对区分大小写的字词使用相同的词。我想你现在可以管理了。或者需要任何帮助,然后发表评论。

【讨论】:

    【解决方案2】:

    如果你真的需要做那个“丑陋的替换”,请使用String.Replace(我认为以这种方式添加样式是一种不好的做法):

    string search = "cigarette";
    string replacement = "<span style='color: red;'>cigarette</span>";
    string sentence = "In an out of the box way to reduce number of cigarette consumption per day, Vineet, a Delhi University student has started smoking longer cigarettes. Cigarettes have a bad influence on health";
    string newStr = sentence.Replace(search,replacement);
    

    【讨论】:

    • 我无法替换,因为搜索字符串可能区分大小写。前香烟可能会被香烟取代
    • 替换区分大小写。如果您处理 Html,您可能需要 Html.Encode 回复您的字符串。无论如何,这样做来添加样式是不好的。如果我需要一个快速的解决方法,我会选择JQuery.css
    【解决方案3】:

    你可以这样替换单词:

    string search = "cigaret";
    Label1.Text = Label1.Text.Replace(search, "<span style='color: red;'>" + search + "</span>");
    

    【讨论】:

      【解决方案4】:

      您好,最后这是一个工作代码,但我确信可能有更好的方法来做到这一点。如果有人可以即兴发挥,不胜感激。

          string msg = Label1.Text;
      
          string search = "cigarette";
          int searchStringLength  = search.Length;
      
          string startTag = "<span style='color: red;'>";
          string endTag = "</span>";
          int skip = startTag.Length + endTag.Length;
      
          int msgindex = 0;
      
      
          do
          {
              msgindex = msg.IndexOf(search, msgindex, StringComparison.OrdinalIgnoreCase);
              if (msgindex == -1) break;
      
              msg= msg.Insert((msgindex + searchStringLength), endTag);
              msg = msg.Insert(msgindex, startTag);
      
      
              msgindex += searchStringLength + skip;
      
          } while (msgindex != -1);
      
          Label1.Text = msg;
      

      【讨论】:

      【解决方案5】:

      我会做这样的事情。不确定它将如何影响格式(除非格式的 HTML)。

              StringBuilder final = new StringBuilder();
              foreach (string split in Label1.Text.Split(' '))
              {
                  if (Regex.Match(split, "[a-zA-Z]+").Value.Equals("cigarettes", StringComparison.CurrentCultureIgnoreCase))
                  {
                      final.Append(@"<span style='color: red;'>");
                      final.Append(split);
                      final.Append(@"</span>");
                  }
                  else
                  {
                      final.Append(split);
                  }
                  final.Append(' ');
              }
              Label1.Text = final.ToString().Trim();
      

      结果:

      In an out of the box way to reduce number of cigarette consumption per day, Vineet, a Delhi University student has started smoking longer <span style='color: red;'>cigarettes.</span> <span style='color: red;'>Cigarettes</span> have a bad influence on health
      

      更新:

      抱歉,您不必执行正则表达式。我发现 CultureInfo 有一个 CompareInfo 属性,可以像忽略大小写 Contains() 方法一样工作:

          static void Main(string[] args)
          {
              string yourstring = @"In an out of the box way to reduce number of cigarette consumption per day, Vineet, a Delhi University student has started smoking longer cigarettes. Cigarettes have a bad influence on health";
              StringBuilder final = new StringBuilder();
              CultureInfo culture = CultureInfo.CurrentCulture;
              foreach (string split in yourstring.Split(' '))
              {
                  if (culture.CompareInfo.IndexOf(split,"cigarette",CompareOptions.IgnoreCase)!=-1)
                  {
                      final.Append(@"<span style='color: red;'>");
                      final.Append(split);
                      final.Append(@"</span>");
                  }
                  else
                  {
                      final.Append(split);
                  }
                  final.Append(' ');
              }
      Label1.Text = final.ToString().Trim();
          }
      

      结果:

      In an out of the box way to reduce number of <span style='color: red;'>cigarette</span> consumption per day, Vineet, a Delhi University student has started smoking longer <span style='color: red;'>cigarettes.</span> <span style='color: red;'>Cigarettes</span> have a bad influence on health
      

      感谢您的尝试。这个解决方案的唯一问题是,它也 突出显示不在搜索字符串中的字母。自从我 暂时有一个带有索引的解决方案。

      显然这就是你想要的:

      Label1.Text = Regex.Replace(Label1.Text, @"(cigarette)", @"<span style='color: red;'>$1</span>", RegexOptions.IgnoreCase);
      

      输出是:

      In an out of the box way to reduce number of <span style='color: red;'>cigarette</span> consumption per day, Vineet, a Delhi University student has started smoking longer <span style='color: red;'>cigarette</span>s. <span style='color: red;'>Cigarette</span>s have a bad influence on health
      

      【讨论】:

      • 您好,谢谢您的回复。我喜欢代码中的一个小调整。这给了我完全匹配。我喜欢在其中突出显示字符串中存在的所有三个单词 香烟。输出应该是 以一种开箱即用的方式减少每天 香烟 消费的数量,德里大学的学生 Vineet 已经开始延长吸烟时间 香烟。 香烟对健康有不良影响
      • 感谢您的尝试。此解决方案的唯一问题是,它还会突出显示不在搜索字符串中的字母。因为我有一个带有索引的解决方案,暂时会这样做。
      • 哎呀呀呀。我不知道那是你想要的。这要容易得多。实际上,您无需为此编写超过一行代码。我将编辑我的答案。
      • 你没有抓住重点。我最初使用的是同一段代码。我想要另一种方法是用搜索字符串替换原始字符串是区分大小写的。这是一个主要问题。正如其他人所建议的那样,我目前的解决方案并没有更好,因为我在代码中包含了样式,并且在搜索单个字符时它会中断:) 无法相信字符串或正则表达式中没有内置或扩展来实现什么我需要..嗯..我的头疼。
      • 我不明白。我的代码包含“RegexOptions.IgnoreCase”。它不区分大小写。输出不是你想要的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2020-06-08
      • 1970-01-01
      相关资源
      最近更新 更多