RegEx如何检查文本是否与所有wordkey匹配或匹配任何两个键

时间:2012-04-11 09:49:11

标签: regex

我希望用某些条件测试字符串匹配

条件:所有密钥必须存在。

RegExp:^(?=.*key1)(?=.*key3)(?=.*key2)

文字:rer key1 werjk key2 and key2 and key3 and end

文字匹配!

现在我的问题是:

  • 如何测试字符串以匹配三个中的任意两个键?
  • 如何测试字符串以匹配三个中的任何一个键?

2 个答案:

答案 0 :(得分:1)

在单个正则表达式中解决这个问题并非易事。好吧,对于您展示的简单示例, 是微不足道的,但它不会扩展,因为您需要自己进行可能的排列。

三分之二(以详细模式编写的“可读性”:

^
(?:
 (?=.*key1)(?=.*key2)(?!.*key3)
 |
 (?=.*key1)(?=.*key3)(?!.*key2)
 |
 (?=.*key3)(?=.*key2)(?!.*key1)
)

三分之一:

^
(?:
 (?=.*key1)(?!.*key2)(?!.*key3)
 |
 (?=.*key2)(?!.*key1)(?!.*key3)
 |
 (?=.*key3)(?!.*key2)(?!.*key1)
)

答案 1 :(得分:1)

如果密钥是普通字符串,那么这种情况下不使用正则表达式可能更有效,更清晰。例如在Python中(使用True == 1False == 0)的事实:

def matchExactlyN(text, keys, n):
   return sum(key in text for key in keys) == n
>>> text = "rer key1 werjk" 
>>> matchExactlyN(text, ["key1","key2","key3"], 1) # 1 of 3
True
>>> matchExactlyN(text, ["key1","key2","key3"], 2) # 2 of 3
False