用于不区分大小写匹配的 Velocity RegEx
Velocity RegEx for case insensitive match
我想在 Velocity 模板(使用 Javascript)中实现一种词汇表。以下是用例:
- 有大量项目的描述可能包含对预定义术语的引用
- 有一个定义的术语列表 -> allGlossary
- 我想自动查找并标记出现在所有项目描述中的 allGlossary 列表中的所有项目
示例:
allGlossary = ["GUI","RBG","fine","Color Range"]
项目描述:应仅使用预定义的 RGB 颜色范围生成界面 (GUI)。
在 运行 脚本之后,我希望描述看起来像这样:
"The interface (GUI) shall be generated using only a pre-defined RGB Color Range."
注意:即使 "fine" 确实出现在描述中 (defined),也不会被标记.
我想将每个项目的描述拆分为单词,但后来我错过了所有超过 1 个单词的词汇表项目。我目前的想法是在每个描述的列表中查找每个项目,但我有以下限制:
- 我只需要在 2 个列表(单个和多个单词)中找到完全匹配的项目
- 搜索必须不区分大小写
- 找到的项目可能位于文本的开头或结尾,并由各种符号分隔:space、逗号、句号、圆括号、方括号等
我有以下有效但不区分大小写的代码:
#set($desc = $item.description)
#foreach($g in $allGlossary)
#set($desc = $desc.replaceAll("\b$g\b", "*$g*"))
#end##foreach
有人可以帮忙设置为不区分大小写吗?或者有人有更好的方法吗?
谢谢!
更新:
根据下面的答案,我尝试在我的速度模板页面中执行以下操作:
#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
.
您提到,您正在使用 JavaScript 进行这些计算。因此,一种简单的方法是迭代 allGlossary
数组并为每次迭代创建一个正则表达式,并使用该表达式查找和替换文本中的所有匹配项。
要仅查找单词边界之间的值,您可以使用 \b
。这允许像 (RGB)
或 Color Range?
这样的匹配。要匹配不区分大小写,您可以使用 /i
标志并查找字符串中的每个实例(不仅仅是第一个),您可以使用全局标志 /g
.
仅在 JavaScript 中支持动态创建正则表达式(其中包含变量),前提是您使用正则表达式的构造函数表示法(不要忘记转义斜线)。对于静态正则表达式,您还可以使用:/\bRGB\b/ig
。这是动态的:
new RegExp("\b("+item+")\b", 'gi');
这是一个基于您的示例字符串的完整功能示例。 它将 allGlossary
数组的每个项目替换为 HTML 包装版本。
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></b>");
}
console.log(itemDescription);
如果这不是您期望的解决方案,您可以在下方发表评论。
我想在 Velocity 模板(使用 Javascript)中实现一种词汇表。以下是用例:
- 有大量项目的描述可能包含对预定义术语的引用
- 有一个定义的术语列表 -> allGlossary
- 我想自动查找并标记出现在所有项目描述中的 allGlossary 列表中的所有项目
示例:
allGlossary = ["GUI","RBG","fine","Color Range"]
项目描述:应仅使用预定义的 RGB 颜色范围生成界面 (GUI)。
在 运行 脚本之后,我希望描述看起来像这样: "The interface (GUI) shall be generated using only a pre-defined RGB Color Range."
注意:即使 "fine" 确实出现在描述中 (defined),也不会被标记.
我想将每个项目的描述拆分为单词,但后来我错过了所有超过 1 个单词的词汇表项目。我目前的想法是在每个描述的列表中查找每个项目,但我有以下限制:
- 我只需要在 2 个列表(单个和多个单词)中找到完全匹配的项目
- 搜索必须不区分大小写
- 找到的项目可能位于文本的开头或结尾,并由各种符号分隔:space、逗号、句号、圆括号、方括号等
我有以下有效但不区分大小写的代码:
#set($desc = $item.description)
#foreach($g in $allGlossary)
#set($desc = $desc.replaceAll("\b$g\b", "*$g*"))
#end##foreach
有人可以帮忙设置为不区分大小写吗?或者有人有更好的方法吗?
谢谢!
更新: 根据下面的答案,我尝试在我的速度模板页面中执行以下操作:
#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
.
您提到,您正在使用 JavaScript 进行这些计算。因此,一种简单的方法是迭代 allGlossary
数组并为每次迭代创建一个正则表达式,并使用该表达式查找和替换文本中的所有匹配项。
要仅查找单词边界之间的值,您可以使用 \b
。这允许像 (RGB)
或 Color Range?
这样的匹配。要匹配不区分大小写,您可以使用 /i
标志并查找字符串中的每个实例(不仅仅是第一个),您可以使用全局标志 /g
.
仅在 JavaScript 中支持动态创建正则表达式(其中包含变量),前提是您使用正则表达式的构造函数表示法(不要忘记转义斜线)。对于静态正则表达式,您还可以使用:/\bRGB\b/ig
。这是动态的:
new RegExp("\b("+item+")\b", 'gi');
这是一个基于您的示例字符串的完整功能示例。 它将 allGlossary
数组的每个项目替换为 HTML 包装版本。
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></b>");
}
console.log(itemDescription);
如果这不是您期望的解决方案,您可以在下方发表评论。