3

レベルが有効かどうかを確認しようとしています。レベルは次の形式です: (ただし、これらはさらに 998 個あります)

bbbbbbb
b41111b
b81400b
b81010b
b01121b
b08001b
bbbbbbb

レベルはいくつかのルールに従う必要があります。すべてのルールに準拠する正規表現を作成しましたが、次の 1 つを除きます。レベルには、1 かける 2 と 1 かける 4 が正確に含まれている必要があります。

これは学校のプロジェクトなので、答えを教えてください。前もって感謝します。

編集:

私の現在の正規表現は次のとおりです。

^b{' + str(length) + r'}\n(b{1}[0-8]{' + str(length - 2) + r'}b{1}\n)+b{' + str(length) + '}$

上のレベルでは、長さ = 7 この間違った上のレベルをフィルタリングしようとさえしないことに注意してください。その他のルールは次のとおりです。

  1. レベルは「b」で囲む必要があります
  2. レベルには、文字「b」と 9 未満の数字のみを含めることができます。
  3. 1つしかあり得ない 2
  4. 4 は 1 つしか存在できません。

上記の正規表現はルール 1 と 2 を考慮に入れていますが、ルール 3 と 4 を理解する必要があります。

ルックアラウンドなどを試しましたが、わかりませんでした。

4

3 に答える 3

0

これは、すべての条件を満たす正規表現です。

^b(?!(?:[^2]*2){2,})(?!(?:[^4]*4){2,})[b0-8]*b$
  • b で始まり、b で^b終わる$b
  • 文字 b と数字 0 ~ 8 のみで構成されます。[b0-8]*
  • を使用して複数の数字 2 を許可しません(?!(?:[^2]*2){2,})
  • を使用して複数の数字 4 を許可しません(?!(?:[^4]*4){2,})
于 2013-11-11T17:02:43.803 に答える
0

正確に 1 の正規表現は次のaようになります[^a]*a[^a]*(つまり、空である可能性のある非aのシーケンスの後に a が続き、その後に非の可能性がある空のシーケンスが続きますa)。複数の行を処理する方法と、これがレベル全体をカバーしていることを確認する方法については、演習として残しておきます。

正確に 1aおよび 1 b:[^ab]*((a[^ab]*b)|(b[^ab]*a))[^ab]*の場合、同じ注意事項があります。説明: a-or-b 以外のシーケンスの後に、1) a、a-or-b 以外の連続、および ab、または 2) ab、a-or-b 以外の連続、および a の後に、a または b 以外の一連の文字が続きます。

于 2013-11-11T15:54:19.863 に答える
0

答えは、入力の開始に固定された否定的な先読みを使用することです。

何を一致させようとしているのか不明なので<your-regex>、現在の正規表現にプレースホルダーを使用します。

^(?!.*?2.*?2)(?!.*?4.*?4)<your-regex>

rhis が 1 つ以上の "2" を正しく拒否するライブ デモを参照してください。

于 2013-11-11T15:54:42.850 に答える