【问题标题】:Regex pattern highlight string words inside double quotes正则表达式模式突出显示双引号内的字符串单词
【发布时间】:2018-09-20 00:58:41
【问题描述】:

如果我在"" 内有单词,我想添加一个条件var wordsToHighlight =' "word1, word2" ' 表示在整个文本中突出显示word1 word2

exp var wordsToHighlight = ' "a reference, server" ' 表示在全文中突出显示a reference server

我的问题需要在整个文本中突出显示双引号内的文本

说明:

  • * 被截断并且运行良好

  • ? 高亮单词+ n 个字符

  • .split(/"([^"]+)"|\s+/).filter(Boolean)

    它会在推送时用双引号子串分割字符串 双引号之间的子字符串到结果数组中 (String#split 总是将捕获的子字符串推入 结果数组),并带有 1+ 个空格和 .filter(Boolean) 将 删除拆分操作期间可能产生的空项。

var row = {
  "Abstract": "I have a reference server for reference and just a server here server test." 
};

var wordsToHighlight = ' "a reference, server" jus? fo* ';
var result = row["Abstract"];
wordsToHighlight.split(/"([^"]+)"|\s+/).filter(Boolean).forEach(function (word) {
word = word.replace(/\*/g, '\\S*').replace(/\?/g, '.').replace(/\"/g, '.');
result = result.replace(new RegExp('(\\s|^)(' + word + ')(?=\\s|$)', "gi"),'$1<span style="background-color:yellow;">$2</span>');
});
document.querySelector("#result").innerHTML = result;
&lt;div id="result"&gt;&lt;/div&gt;

我预期的结果:

【问题讨论】:

  • 看来你可以写"a reference" server jus? fo* 让它与当前代码一起工作。您对wordsToHighlight 的内容有任何控制权吗?还是用户自定义?

标签: javascript regex


【解决方案1】:

您需要以更复杂的方式解析要突出显示的单词:拆分双引号字符串和非空白块。后者可以按原样添加到结果数组中,但双引号中的内容应该用逗号(以及任何封闭的空格)分隔。

var row = {
  "Abstract": "I have a reference server for reference and just a server here server test." 
};

var wordsToHighlight = ' "a reference, server" jus? fo* ';
var result = row["Abstract"];
var wordsTH2=[], m;
var rx = /"([^"]+)"|\S+/g;
while (m=rx.exec(wordsToHighlight)) {
  if (m[1]) {
     var arr = m[1].split(/\s*,\s*/);
     for (var i=0; i<arr.length;i++) {
        wordsTH2.push(arr[i]);
     }
  } else {
    wordsTH2.push(m[0]);
  }
}
wordsTH2.forEach(function (word) {
word = word.replace(/\*/g, '\\S*').replace(/\?/g, '.').replace(/\"/g, '.');
result = result.replace(new RegExp('(\\s|^)(' + word + ')(?=\\s|$)', "gi"),'$1<span style="background-color:yellow;">$2</span>');
});
document.querySelector("#result").innerHTML = result;
&lt;div id="result"&gt;&lt;/div&gt;

【讨论】:

  • 您可以使用有关如何将数组推送到数组from here的想法。
  • 使用最简单的for (var i=0; i&lt;arr.length;i++) {
  • rx = /["“]([^"”]+)["”]|\S+/g;
  • @MokiNex 没问题,只需按长度降序排列wordsTH2,见this demo
  • 我添加了一个&lt;span style="background-color:yellow;"&gt;.*?&lt;/span&gt;| 替代最终正则表达式,您可以将. 替换为[^] 以跨行匹配,它将匹配已经突出显示且不会触及它们的术语因为如果匹配,则第 1 组和第 2 组未定义,如果第 1 组和第 2 组匹配,则术语 ($2) 将被新跨度包裹。
猜你喜欢
  • 2023-03-08
  • 2016-08-20
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2021-05-16
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多