Velocity RegEx用于不区分大小写的匹配

时间:2017-02-13 21:32:20

标签: javascript regex velocity

我想在 Velocity模板(使用Javascript)中实现一种词汇表。以下是用例:

  • 有大量项目,其描述可能包含对预定义术语的引用
  • 有一个定义的术语列表 - > allGlossary
  • 我想自动查找并标记allGlossary列表中出现在所有项目描述中的所有项目

示例:

allGlossary = [" GUI"," RBG","罚款","颜色范围"]

项目描述:仅使用预定义的RGB颜色范围生成界面(GUI)。

运行脚本后,我希望描述看起来像这样: "界面( GUI )应仅使用预定义的 RGB 颜色范围生成。"

注意:即使"罚款"确实出现在描述中(de 精细 d),它不会被标记。

我想把每个项目的描述拆分成单词然后我想念所有超过1个单词的词汇表项目。我目前的想法是在每个描述中查找列表中的每个项目,但我有以下限制:

  • 我只需找到2个列表(单个和多个单词)中确切项目的匹配项
  • 搜索必须不区分大小写
  • 找到的项目可能位于文本的开头或结尾,并以各种符号分隔:空格,逗号,句点,括号,括号等。

我有以下代码可以使用但不区分大小写:

#set($desc = $item.description)
#foreach($g in $allGlossary)
    #set($desc = $desc.replaceAll("\b$g\b", "*$g*"))
#end##foreach

有人可以帮助让这个不区分大小写吗?或者有没有人有更好的方法来做到这一点?

谢谢!

更新: 根据下面的答案,我尝试在Velocity Template页面中执行以下操作:

#set($allGlossary = ["GUI","RGB","fine","Color Range"])
#set($itemDescription = "The interface (GUI) shall be generated using only a pre-defined RGB color range.")

<script type="text/javascript">
    var allGlossary = new Array();
    var itemDescription = "$itemDescription";
</script>

#foreach($a in $allGlossary)
    <script type="text/javascript">
        allGlossary.push("$a");
        console.log(allGlossary);
    </script>
#end##foreach

<script type="text/javascript">
    console.log(allGlossary[0]);
</script>

问题在于,如果我尝试显示整个allGlossary数组,它包含正确的元素。一旦我尝试只显示其中一个(如示例中所示),我就会收到错误Uncaught SyntaxError: missing ) after argument list

1 个答案:

答案 0 :(得分:4)

您提到过,您正在使用JavaScript进行这些计算。因此,一种简单的方法是迭代allGlossary数组并为每次迭代创建一个正则表达式,并使用此表达式查找并替换文本中的所有匹配项。

要仅查找字边界之间的值,您可以使用\b。这样可以使用(RGB)Color Range?等匹配项。要匹配不区分大小写,可以使用/i标志并查找字符串中的每个实例(而不仅仅是第一个),您可以使用全局标记/g

如果使用正则表达式的构造符表示法(不要忘记转义斜杠),则仅在JavaScript中支持动态创建正则表达式(其中包含变量)。对于静态正则表达式,您还可以使用:/\bRGB\b/ig。这是动态的:

new RegExp("\\b("+item+")\\b", 'gi');

以下是基于示例字符串的完整功能示例。 它将allGlossary数组的每个项目替换为HTML包装版本。 < / p>

var allGlossary = ["GUI","RGB","fine","Color Range"]
var itemDescription = "The interface (GUI) shall be generated using only a pre-defined RGB color range.";

for(var i=0; i<allGlossary.length; i++) {
  var item = allGlossary[i];
  var regex = new RegExp("\\b("+item+")\\b", 'gi');
  itemDescription = itemDescription.replace(regex, "<b>$1</b>");
}

console.log(itemDescription);

如果这不是您预期的解决方案,您可以在下面发表评论。