Regex从术语列表中提取多词匹配项

Regex to pull multiword matches from list of terms

本文关键字:提取 术语 列表 Regex      更新时间:2023-09-26

我正试图从glossarizer插件中修改以下正则表达式(javascript),使其不那么宽松。

 var regex = new RegExp("(^s*|[^!])" + this.clean(term) + "''s*|'',$", "i");

它试图在术语和定义的JSON数组中检索术语的定义。

[{term: "black cat", definition: "a black cat"},
{term: "cat", definition: "meow"}]

现在,当我传入"cat"时,它正在匹配"blackcat",但我不希望它匹配。我希望它匹配从字符串开头或逗号和*/s之后开始,以逗号或字符串结尾结束的东西,这样就可以传入多个定义。

*Match for cat:
'cat'
' Cat '
'cat, feline'
'feline, cat  , cheetah'
*Not a match for cat:
'black cat'
'Catapult'
'!cat'

我试着放new RegExp("(^|^s*|[^!])" + this.clean(term) + "''s*$|''s*,", "i")(添加管道,这样它应该是字符串或逗号和空白的开头,所以在结尾它应该是空白,后面跟着逗号或字符串的结尾,但它没有达到预期的效果(使用regex101.com,但很困惑)

您最好用逗号分隔列表并过滤结果。Regex(尤其是JS风格的,缺少lookbehinds)不善于解析这样的语法。

terms = "feline, cat, cheetah";
if(terms.toLowerCase().split(", ").indexOf("cat") >= 0)
   // a cat was there!

您可以使用此正则表达式来匹配您的有效案例:

/(?:^|,) *'bcat(?= *(?:,|$))/gmi

RegEx演示

很抱歉将其添加为答案而非评论(尚未获得足够的声誉来添加新评论)。这是关于检查插件是否使用了正确的JSON,因为您的"不匹配"列表让我感到困惑。对于"不匹配的",每个被拒绝的术语都需要!在其前面,因此JSON可能是

[
{
term: "black cat",
definition: "a black cat"
},
{
term: "!black cat, cat, !Catapult",  
definition: "meow"
}
] 

这将匹配整个单词cat,包括前后的标点符号,加上ginger cat"帽子里的猫"我的猫"等,但不匹配catastrophecats。如果这是您想要的,那么只需要对json进行更改。不过,上一个答案中的RegEx可能更符合您的需求。

自从你发布你的问题后,已经进行了相关的开发人员更新,这可能是有用的

忽略!在获得术语描述的同时https://github.com/PebbleRoad/glossarizer/blob/master/jquery.glossarize.js