3

Regex の本を購入して理解しようとしましたが、まだ苦労しています。文字列構成を満たすJava正規表現を作成しようとしています。

  1. 小文字を含めることができます ([az])
  2. コンマ (,) を含めることができますが、単語の間にのみ使用できます
  3. コロン (:) を含めることができますが、単語または乗算 (*) で区切る必要があります
  4. ハイフン (-) を含めることができますが、単語で区切る必要があります
  5. 乗算 (*) を含めることができますが、使用する場合は、コロンの前/間/後の唯一の文字でなければなりません
  6. スペースを含めることはできません。「単語」はハイフン (-)、コンマ (,)、コロン (:)、または文字列の末尾で区切られます

したがって、たとえば次のようになります。

  1. フー:バー
  2. foo-bar:foo
  3. フー、バー:フー
  4. フーバー、フー:バー、フーバー
  5. フー:バー:フー、バー
  6. *:ふー
  7. フー:*
  8. *:*:*

しかし、次は偽になります。

  1. フー:バー
  2. ,foo:バー
  3. foo-:バー
  4. -foo:バー
  5. foo,:bar-
  6. フー:バー、
  7. foo,*:バー
  8. foo-*:バー

これは私がこれまでに持っているものです:

^[a-z-]|*[:?][a-z-]|*[:?][a-z-]|*
4

2 に答える 2

2

ここでは、ポジティブ テスト ケースとネガティブ テスト ケースを定義できる人をめったに見かけません。それはライブを本当に簡単にします。

95% のソリューションを使用した正規表現は次のとおりです。

  • "(([a-z]+|\\*)[:,-])*([a-z]+|\\*)"(JAVA版)
  • (([a-z]+|\*)[:,-])*([a-z]+|\*)(プレーンな正規表現)

単語 (az または *) とセパレーター (:-, のいずれか) を区別するだけで、少なくとも 1 つの単語が含まれている必要があり、単語はセパレーターで区切られている必要があります。最後の 2 つの負のケースを除いて、正のケースと負のケースで機能します。

1 つのコメント: このような複雑な「構文」は、実際には ANTLR のような文法定義ツール (または数年前には lex/yacc、flex/bison を使用) を使用して実装されます。正規表現はそれを行うことができますが、維持するのは容易ではありません.

于 2013-09-12T15:23:48.827 に答える