我希望在某些条件下测试字符串匹配
条件:所有键都必须存在。
正则表达式:^(?=.*key1)(?=.*key3)(?=.*key2)
文本:rer key1 werjk key2 and key2 and key3 and end
文字匹配!
现在我的问题:
- 如何测试字符串以匹配三个键中的任意两个键?
- 如何测试字符串以匹配三个键中的任何一个?
我希望在某些条件下测试字符串匹配
条件:所有键都必须存在。
正则表达式:^(?=.*key1)(?=.*key3)(?=.*key2)
文本:rer key1 werjk key2 and key2 and key3 and end
文字匹配!
现在我的问题:
在单个正则表达式中解决这个问题并非易事。好吧,对于您展示的简单示例来说,这是 微不足道的,但它不会扩展,因为您需要自己进行可能的排列。
三分之二(以“可读性”的详细模式编写:
^
(?:
(?=.*key1)(?=.*key2)(?!.*key3)
|
(?=.*key1)(?=.*key3)(?!.*key2)
|
(?=.*key3)(?=.*key2)(?!.*key1)
)
三选一:
^
(?:
(?=.*key1)(?!.*key2)(?!.*key3)
|
(?=.*key2)(?!.*key1)(?!.*key3)
|
(?=.*key3)(?!.*key2)(?!.*key1)
)
如果键是纯字符串,那么在这种情况下,不使用正则表达式可能更有效、更清晰。True == 1
例如在 Python 中(使用and的事实False == 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