明らかに、|
(パイプ?) を使用して を表すことができますが、同様OR
に表す方法はありますか?AND
具体的には、特定のフレーズをすべて含むテキストの段落を特定の順序で一致させたいと考えています。
消費しない正規表現を使用します。
典型的な (Perl/Java などの) 表記法は次のとおりです。
(?=
式)
これは、「exprに一致しますが、その後は元の一致点で一致を継続する」ことを意味します。
これらはいくつでも実行できます。これは「and」になります。例:
(?=match this expression)(?=match this too)(?=oh, and this)
一部のデータを保存する必要がある場合は、非消費式内にキャプチャ グループを追加することもできます。
他のレスポンダーの一部が言ったように、先読みを使用する必要がありますが、先読みでは、ターゲット単語と現在の一致位置の間の他の文字を考慮する必要があります。例えば:
(?=.*word1)(?=.*word2)(?=.*word3)
最初の.*
先読みでは、「word1」に到達する前に必要な数の文字に一致させることができます。次に、一致位置がリセットされ、2 回目の先読みで「word2」が検索されます。もう一度リセットすると、最後の部分が「word3」と一致します。これはチェックする最後の単語であるため、先読みである必要はありませんが、害はありません。
段落全体を一致させるには、両端で正規表現を固定し、最後の文字を追加し.*
て残りの文字を消費する必要があります。Perl スタイルの表記法を使用すると、次のようになります。
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
'm' 修飾子は複数行モード用です。とを段落の境界 (正規表現で言えば「行の境界」) で一致さ^
せます。$
この場合、's' 修飾子を使用しないことが重要です。これにより、ドット メタ文字が他のすべての文字と同様に改行に一致するようになります。
最後に、長い単語の断片だけでなく、単語全体を一致させる必要があるため、単語の境界を追加する必要があります。
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m
この例を見てください:
2 つの正規表現 A と B があり、両方を一致させたいので、擬似コードでは次のようになります。
pattern = "/A AND B/"
次のように AND 演算子を使用せずに記述できます。
pattern = "/NOT (NOT A OR NOT B)/"
PCRE で:
"/(^(^A|^B))/"
regexp_match(pattern,data)
AND 演算子は、RegExp 構文で暗黙的に使用されます。
OR 演算子は、代わりにパイプで指定する必要があります。
次の正規表現:
var re = /ab/;
は文字a
と文字を意味しb
ます。
グループでも機能します。
var re = /(co)(de)/;
co
グループとグループを意味しde
ます。
(暗黙の) AND を OR に置き換えるには、次の行が必要になります。
var re = /a|b/;
var re = /(co)|(de)/;
正規表現でそれを行うことができますが、おそらく他の方法が必要になるでしょう。たとえば、いくつかの正規表現を使用し、それらを if 句で結合します。
次のように、標準の正規表現ですべての可能な順列を列挙できます (任意の順序で a、b、および c に一致します)。
(abc)|(bca)|(acb)|(bac)|(cab)|(cba)
ただし、2 つ以上の用語がある場合、これは非常に長く、おそらく非効率的な正規表現になります。
Perl や Java などの拡張正規表現バージョンを使用している場合は、これを行うためのより良い方法があります。他の回答では、正の先読み操作を使用することが提案されています。
あなたの場合、複数の一致する結果に対して AND を実行することはできませんか? 疑似コードで
regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...
なぜawkを使わないのですか?
awk 正規表現 AND、OR の問題はとても簡単です
awk '/WORD1/ && /WORD2/ && /WORD3/' myfile
Perl の正規表現を使用する場合は、正の先読みを使用できます。
例えば
(?=[1-9][0-9]{2})[0-9]*[05]\b
100 より大きく、5 で割り切れる数
順序は、正規表現の構造で常に暗示されます。目的を達成するには、入力文字列をさまざまな式に対して複数回照合する必要があります。
あなたがしたいことは、単一の正規表現では不可能です。
正規表現の外で AND を使用します。PHP では、先読み演算子が機能していないようでした。代わりにこれを使用しました
if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
return true;
else
return false;
上記の正規表現は、パスワードの長さが 3 文字以上で、パスワードにスペースが含まれていない場合に一致します。