いくつかの条件で文字列の一致をテストしたい
状態: すべてのキーが存在する必要があります。
正規表現:^(?=.*key1)(?=.*key3)(?=.*key2)
文章:rer key1 werjk key2 and key2 and key3 and end
テキスト一致!
そして今、私の質問:
- 3 つのキーのうち任意の 2 つのキーに一致する文字列をテストするにはどうすればよいですか?
- 文字列をテストして、3 つのうちのいずれかのキーに一致するようにするにはどうすればよいですか?
いくつかの条件で文字列の一致をテストしたい
状態: すべてのキーが存在する必要があります。
正規表現:^(?=.*key1)(?=.*key3)(?=.*key2)
文章:rer key1 werjk key2 and key2 and key3 and end
テキスト一致!
そして今、私の質問:
キーがプレーンな文字列である場合、これは正規表現を使用しない方がおそらくより効率的で明確な状況です。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
これは、単一の正規表現で解決するのは簡単ではありません。さて、あなたが示した単純な例にとっては 些細なことですが、可能な順列を自分で行う必要があるため、スケーリングされません。
3つのうち2つ(「読みやすさ」のために冗長モードで書かれています:
^
(?:
(?=.*key1)(?=.*key2)(?!.*key3)
|
(?=.*key1)(?=.*key3)(?!.*key2)
|
(?=.*key3)(?=.*key2)(?!.*key1)
)
3人に1人:
^
(?:
(?=.*key1)(?!.*key2)(?!.*key3)
|
(?=.*key2)(?!.*key1)(?!.*key3)
|
(?=.*key3)(?!.*key2)(?!.*key1)
)