2011-11-05 6 views
96

私は現在、ユーザーが単語を正しく入力したかどうかを確認するボキャブラリーアルゴリズムをプログラミングしています。次のような状況があります。 単語の正しい解決方法は「part1、part2」です。 ユーザーは、「part1」(回答1)、「part2」(回答2)または「part1、part2」(回答3)のいずれかを入力できる必要があります。 私は今、以下でユーザーによって与えられた文字列に一致するようにしようと、自動的に作成、正規表現式は:答え3は間違っているだろうがおよび/または正規表現の演算子

^(part1|part2)$ 

これだけリターンは1と2が正しいと答えます。私は現在、|と同じような演算子があるかどうか疑問に思っています。 「どちらか...」の代わりに「および/または」と表示されます。 誰でも私を助けることができますか?

+0

正規表現のための最初の作品は、このための最善の解決策ではないかもしれません。私は通常の文字列メソッドを使用します。 –

+1

この問題はあまり指定されていません。あなたが必要とするすべてが合法な文字列との正確な文字列比較であるときにパターンマッチングを使用するのはなぜですか?あなたのregexコンパイラがPerlのやり方とは別の方法をO(1)trie構造に最適化しない限り、代わりにハッシュメンバーシップに対するテストを行うべきでしょう。他の正規表現エンジンはこれほど巧妙ではありません。 – tchrist

答えて

132

あなたはパート1とパート2以外の単語を含むように動的正規表現を構築したい、とあなたは問題にしないようにするためにしたいこと。あなたはこのようなものを使用することができますので、場合:

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

正は一致します。

part1 
part2, part1 
part1, part2, part3 

負の試合:

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

「part1、part」1も正であることに注意してください。それはいつも望ましいとは限りません – dimaaan

+0

@dimaaanあなたは引用符を間違っていましたか? "part1、part1"は一致しますが、 "part1、part"は一致しません。そのようなシナリオがこの解決策ではカバーされていないのは間違いないが、テスト文字列が語彙の単語で構成されているかどうかを確認するOPのアプリケーションでは、単語が繰り返される。あなたが持っているインスタンスの数にかかわらず、その単語はまだ語彙の一部になります。 – Mithon

2

正規表現の専門家ではありませんが、^((part1|part2)|(part1, part2))$とすることができます。言い換えれば、「パート1またはパート2またはその両方」

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

それは機能しますか?

2

それとも、これを使用することができます:私は仮定するつもりです

^(?:part[12]|(part)1,\12)$ 
5

は交代せずにこの仕事をしていますか?

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

これはなぜですか?

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

(GNUは4.1.5をsedを使用して)すべてが、part2ための第二のすべての条件

関連する問題