我可以有一个正则表达式匹配字符串:
- 在列表中包含1个以上关键字,
- 字符串中关键字的顺序可以任意
给定一个关键字列表(不限于3项,但可以相当短(例如<10项)):
apple
banana
cherry
要匹配:
loved apple and banana.
cherry is purple and banana is yellow.
apple, banana, cherry are all fruits.
但不匹配:
apple tastes good.
a yellow fruit can be an banana.
可选不匹配(如果可能):
cherry is cherry
这就像在一个字符串中计算关键字的数量,并选择那些有多个关键字的。
我想要这个,因为我不能有控制流写在一些随机的应用程序(唯一可能的方法来定义一个过滤器在该应用程序是写一个正则表达式)。
我不知道这个应用程序使用什么正则表达式库(假设它使用的是现代的)。
进一步的问题:我可以有一个正则表达式,匹配包含N
-项目关键字列表中至少k
关键字的字符串?
^.*?(apple|banana|cherry).*?((?!1)(?:apple|banana|cherry)).*?$
简短的解释^
字符串起始.*?
任意字符的非贪婪匹配(apple|banana|cherry)
捕获其中一个名称作为第一个捕获组(
捕获组(?!1)
匹配下一个组,否定第一个捕获组的确切值(?:apple|banana|cherry)
其中一个名称
)
关闭组
^
字符串起始.*?
任意字符的非贪婪匹配(apple|banana|cherry)
捕获其中一个名称作为第一个捕获组(
捕获组(?!1)
匹配下一个组,否定第一个捕获组的确切值(?:apple|banana|cherry)
其中一个名称
)
关闭组查看正则表达式demo1
编辑:使用缩短版
^.*?(apple|banana|cherry).*?((?!1)(?1)).*?$
查看正则表达式demo2
注意:我在((?!1)(?:apple|banana|cherry))
使用了第二个捕获组,只是为了突出显示关键字。你可以用(?:(?!1)(?:apple|banana|cherry))
代替。