AND / OR演算子は正規表現のようにどのように表されますか?


219

私は現在、ユーザーが単語を正しく入力したかどうかをチェックする語彙アルゴリズムをプログラミングしています。私は次のような状況にあります。単語の正しい解決策は「part1、part2」です。ユーザーは、「part1」(回答1)、「part2」(回答2)、または「part1、part2」(回答3)のいずれかを入力できる必要があります。次に、ユーザーが指定した文字列を、自動的に作成される次の正規表現と照合します。

^(part1|part2)$

これは正解として回答1と2のみを返しますが、回答3は間違っています。|に似た演算子があるかどうか疑問に思っています。のand/or代わりに言うeither...or

誰かがこの問題を解決するのを手伝ってくれませんか?


1
正規表現は、このための最良の解決策ではない可能性があります。通常の文字列メソッドを使用します。
Felix Kling

3
この問題の仕様は不十分です。正当な文字列のセットに対する正確な文字列比較だけが必要なのに、なぜパターンマッチングを使用するのですか?正規表現コンパイラがPerlのようにO(1)トライ構造の代替案を最適化しない限り、代わりにハッシュメンバーシップに対してテストを行う必要があります。他の正規表現エンジンは、これではあまり賢くありません。
tchrist

@tchristユースケースは、mongodb $or正規表現の一致である可能性があります
Nadir Abbas

回答:


283

ここでは、part1とpart2以外の単語を含むように動的に正規表現を作成し、順序は問題にしないと仮定します。もしそうなら、あなたはこのようなものを使うことができます:

((^|, )(part1|part2|part3))+$

肯定的な一致:

part1
part2, part1
part1, part2, part3

否定的な一致:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
「part1、part」1も正になることに注意してください。これは常に望ましいわけではありません
dimaaan

1
@dimaaan引用符を間違えましたか?「part1、part1」は一致しますが、「part1、part」は一致しません。このようなシナリオはこのソリューションでカバーされていないことは正しいですが、OPのアプリケーションで、テスト文字列が語彙の単語で構成されているかどうかをチェックしているため、単語が繰り返された。単語はいくつあっても、語彙の一部です。
GauteLøken

30
'^(part1|part2|part1,part2)$'

それは機能しますか?


1
明らかに。正規表現では文字列全体が一致する必要があります(^、$)
glasspill

5

これは交互に機能しますか?

^((part)1(, \22)?)?(part2)?$

またはなぜこれではないのですか?

^((part)1(, (\22))?)?(\4)?$

1つ目はすべての条件で動作し、2つ目はそれ以外のすべてで機能しますpart2(GNU sed 4.1.5を使用)。


4

正規表現の専門家ではありませんが、実行できます^((part1|part2)|(part1, part2))$。つまり、「パート1またはパート2または両方」


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.