regex - 組み合わせ - 正規表現 複数マッチ




Regexpを組み合わせる? (4)

のようなさまざまな条件のユーザー入力を収集した後

  1. で始まる: /(^@)/
  2. 終わり: /(@$)/
  3. 内容: /@/
  4. 含まれない

ユーザーが複数の条件を入力すると、単一の正規表現を作成するために、それらを"|" 1と2が与えられると、それは/(^@)|(@$)/

この方法はこれまでのところ機能しますが、

私は正しく決定することができません、どのような正規表現4の条件にする必要がありますか? 正規表現をこのように組み合わせることはできますか?

更新:@(ユーザー入力)は2つの条件では同じではなく、4つの条件が常に存在するわけではありませんが、将来的には「正確に」や「正確にはない」などの条件が必要になることがあります。このアプローチがスケールすることを知ることがより興味がありますか?

また、正規表現が正しくエスケープされるようにユーザー入力のクリーンアップの問題があるかもしれませんが、現在は無視されています。


1 + 2 + 4条件:開始|終了、途中ではない

  /^@[^@]*@?$|^@?[^@]*@$/

ほぼ同じです:

  /^@?[^@]*@?$/

これは@が付いていない文字列にマッチします、サンプル 'my name is hal9000'


4番目のオプションの正規表現を他の正規表現と組み合わせることは、1つの正規表現内では機能しません。 4 + 1は、文字列が@で始まるか、@を全く含んでいないことを意味します。 これを行うには、2つの別々の比較が必要です。


文字列に@が含まれていてはならない場合、すべての文字は@以外の文字でなければなりません。

/^[^@]*$/

これは、 @含まない任意の長さの文字列と一致します。

もう一つの可能​​な解決法は、 /@/真偽結果を反転させることです。


条件はORされるかANDで結合されますか?

Starts with: abc
Ends with: xyz
Contains: 123
Doesn't contain: 456

OR版はかなりシンプルです。 あなたが言ったように、それは主に個々の条件の間にパイプを挿入することです。 正規表現は、選択肢の1つが一致するとすぐに一致を探すのを止めます。

/^abc|xyz$|123|^(?:(?!456).)*$/

その4番目の選択肢は奇妙に見えるかもしれませんが、それは正規表現に "含まれていない"と表現する方法です。 ところで、代替案の順序は関係ありません。 これは事実上同じ正規表現です:

/xyz$|^(?:(?!456).)*$|123|^abc/

ANDバージョンはより複雑です。 個々の正規表現がマッチした後、次の正規表現が入力全体にアクセスできるようにマッチ位置をゼロにリセットする必要があります。 それはすべての条件が先読みとして表現されなければならないことを意味します(技術的には、そのうちの1つが先読みである必要はありません。 ファイナル.*$はマッチを完了させる。

/^(?=^abc)(?=.*xyz$)(?=.*123)(?=^(?:(?!456).)*$).*$/

そして、ANDとOR条件を組み合わせる可能性があります - それが本当の楽しみが始まる場所です。 :D