明らかに、|
(パイプ?)を使用してを表すことができますが、同様OR
に表す方法はありAND
ますか?
具体的には、特定のフレーズのすべてを含むが、特定の順序ではないテキストの段落を照合します。
明らかに、|
(パイプ?)を使用してを表すことができますが、同様OR
に表す方法はありAND
ますか?
具体的には、特定のフレーズのすべてを含むが、特定の順序ではないテキストの段落を照合します。
回答:
消費しない正規表現を使用します。
典型的な(つまり、Perl / Java)表記は次のとおりです。
(?=
expr)
これは、「exprに一致するが、その後、元の一致ポイントで一致を続ける」ことを意味します。
これらは好きなだけ行うことができ、これが「and」になります。例:
(?=match this expression)(?=match this too)(?=oh, and this)
データの一部を保存する必要がある場合は、非消費式の中にキャプチャグループを追加することもできます。
他のレスポンダーの一部が言ったように、先読みを使用する必要がありますが、先読みは、ターゲット単語と現在の一致位置の間の他の文字を考慮する必要があります。例えば:
(?=.*word1)(?=.*word2)(?=.*word3)
.*
最初の先読みでは、それはそれは「単語1」になる前に必要しかし多くの文字を一致させることができます。次に、一致位置がリセットされ、2番目の先読みで「word2」が検索されます。もう一度リセットすると、最後の部分は「word3」に一致します。チェックしている最後の単語なので、先読みである必要はありませんが、害はありません。
段落全体を一致させるには、両端に正規表現をアンカーし、最後.*
に追加して残りの文字を消費する必要があります。Perlスタイルの表記を使用すると、次のようになります。
/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m
'm'修飾子はマルチラインモード用です。段落の境界(正規表現では「行の境界」)でと^
を$
一致させます。この場合、「s」修飾子を使用しないことが重要です。これにより、ドットのメタ文字が改行や他のすべての文字と一致します。
最後に、長い単語の断片だけでなく、単語全体を照合する必要があるため、単語の境界を追加する必要があります。
/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m
.*
と[\s\S]*
あなたは、新しい行を持っている場合はJavaScriptで.
新しい行を一致していませんジャバスクリプトの正規表現エンジン内および修飾子とに行うことができない
この例を見てください:
2つの正規表現AとBがあり、両方に一致させたいので、疑似コードでは次のようになります。
pattern = "/A AND B/"
次のようにAND演算子を使用せずに記述できます。
pattern = "/NOT (NOT A OR NOT B)/"
PCRE:
"/(^(^A|^B))/"
regexp_match(pattern,data)
(?=expr)
は機能しませんでしたが、CMakeでは私にとっては機能しました。実装に依存しているようです。
^
正規表現構文で「文字列の先頭」を意味するのではないですか?
^
は、文字クラスの先頭でのみ否定です。CMakeが本当にファンキーなことをしていない限り(パターンマッチング言語の "regex"の呼び出しが誤解を招く、または正しくないと見なされるまで)、私はそれがあなたのために機能したのは孤立した事故だったと思います。
正規表現を使用してそれを行うことができますが、おそらく他のことをしたいと思うでしょう。たとえば、複数の正規表現を使用し、それらをif句で組み合わせます。
次のように、標準の正規表現を使用してすべての可能な順列を列挙できます(任意の順序でa、b、cに一致します)。
(abc)|(bca)|(acb)|(bac)|(cab)|(cba)
ただし、2つ以上の項がある場合、これは非常に長く、おそらく非効率的な正規表現になります。
PerlやJavaなどの拡張正規表現バージョンを使用している場合は、これを行うための優れた方法があります。他の回答は、肯定的な先読み操作の使用を提案しています。
a(bc|cb)|b(ac|ca)|c(ab|ba)
。そして最も重要なのは、すべての正規表現のフレーバーで使用できることです。
AND演算子は、RegExp構文では暗黙的です。
代わりにOR演算子をパイプで指定する必要があります。
次のRegExp:
var re = /ab/;
文字意味a
と手紙をb
。
グループでも機能します:
var re = /(co)(de)/;
それはグループ意味co
とグループをde
。
(暗黙の)ANDをORで置き換えるには、次の行が必要です。
var re = /a|b/;
var re = /(co)|(de)/;
あなたの場合、いくつかの一致する結果に対してANDを実行することはできませんか?擬似コードで
regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...
受け入れられた答えに加えて
私はあなた方の何人かに物事をより明確にするいくつかの実用的な例を提供します。たとえば、次の3行のテキストがあるとします。
[12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x]
ここでのデモを参照してください DEMO
ここで行うのは、+記号を選択することですが、2つの数値の後にスペースがあり、4つの数値の前にある場合のみです。これらが唯一の制約です。この正規表現を使用してそれを実現します。
'~(?<=\d{2} )\+(?=\d{4})~g'
式を分離すると、異なる結果が得られることに注意してください。
または、タグの間にあるテキストを選択したいかもしれません...しかしタグではありません!それからあなたは使うことができます:
'~(?<=<p>).*?(?=<\/p>)~g'
このテキストの場合:
<p>Hello !</p> <p>I wont select tags! Only text with in</p>
ここでのデモを参照してください DEMO