regex 複数マッチ 正規表現を組み合わせる?




正規表現 複数マッチ (5)

正規表現を使った私の経験では、実際に一致させようとしているものに集中する必要があります。

たとえば\ d {2}

[1-9] [0-9]

最初の式は任意の2桁の数字と一致し、2番目の式は1から9までの1桁と1桁の数字と一致します。 したがって、07を入力すると、最初の式で検証されますが、2番目の式では検証されません。

詳細な参照はこちらを参照してください:

http://www.regular-expressions.info/refadv.html

EDITED:

^((?!my string).)*$正規表現は "my string"を含んでいません。

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

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

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

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

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

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

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


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

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

ほぼ同じです:

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

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


条件は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


@:/(^ [^ @] * $)/

組み合わせの意図した結果が合致していれば、それらのいずれかがマッチする結果になり、マッチすることになります。


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