4

単語のグループを除外しようとしていますが、別の単語のグループを qregexp 式に含めようとしていますが、現在これを理解するのに問題があります。

ここに私が試したことのいくつかがあります(この例にはすべての単語が含まれています):

(words|I|want|to|include)(?!the|ones|that|should|not|match)

だから私はこれを試しました(何も返されませんでした):

^(words|I|want|to|include)(?:(?!the|ones|that|should|not|match).)*$

何か不足していますか?

編集: このような珍しい正規表現 (包含/除外) が必要な理由は、一連の記事を検索して、含まれている単語が含まれているが、除外されている単語も含まれている記事をフィルタリングしたいからです。

たとえば、記事 A が次の場合:

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

記事Bは次のとおりです。

Vivamus fermentum semper porta.

次に、を含む正規表現はlorem記事 A をフィルター処理しますが、B はフィルター処理ipsumしません。

正規表現を使用して、必要な単語を含む記事を除外し、最初のセットから不要な記事を除外する 2 番目の正規表現を実行することを検討しましたが、残念ながら、使用しているソフトウェアではこれを行うことができません。実行できる正規表現は 1 つだけです。

4

5 に答える 5

4

私は、強化された貪欲な量指定子は必要ないと思います。アンカーされた否定的な先読み内で、除外された単語を代替として使用します。これについてご案内します。

Lorem ipsum dolor sit amet, consectetur adipiscing elit.という単語が含まれているため、一致させたいとしますlorem。正規表現は\\blorem\\b( QRegExp.CaseInsensitiveが に設定されている1) であり、\b単語全体の一致を強制するために使用されます。文字列に単語が含まれている場合に一致を防ぐにはipsum、文字列の最初で先読みを使用する必要があります。

^(?!.*\\bipsum\\b).*\\blorem\\b

現在、問題の文字列と一致しません

代替を追加するには、代替演算子|を使用できます。次のように実行できます^(?!.*\\b(?:words|to|exclude)\\b).*\\b(?:words|to|include)\\b非キャプチャ グループの使用に注意してください。キャプチャされたテキストは保存されず、一致したテキストをバッファに保存するキャプチャ グループと比較してパフォーマンスが向上する可能性があります。

したがって、あなたは得る

^(?!.*\\b(?:the|ones|that|should|not|match)\\b).*\\b(?:words|I|want|to|include)\\b

デモを見る

2 つの注意事項:

  1. デモ Web サイトでは、単一のバックスラッシュを使用する必要があります。ここでは、QRegExp.
  2. Qt では.、パターンは改行を含む任意の文字に一致します。デモ Web サイトでは、ドットは改行記号と一致しません。[^\n]同じ機能が必要な場合は置き換えた方がいいかもしれませんが、私は必要ないと思います。
于 2015-08-17T23:45:13.650 に答える
2
^(?:(?!\b(?:the|ones|that|should|not|match)\b).)*\b(?:words|I|want|to|include)\b(?:(?!\b(?:the|ones|that|should|not|match)\b).)*$

一致する単語を見つけたら、両方の部分に先読みを追加する必要があります。デモを参照してください。

https://regex101.com/r/bK9wF1/3

また

^(?!.*\b(?:the|ones|that|should|not|match)\b)(?=.*\b(?:words|I|want|to|include)\b).*$

下に両方の条件を追加しますlookaheads。デモを参照してください。

https://regex101.com/r/uF4oY4/60

于 2015-08-18T04:56:21.473 に答える
2

あなたはとても近かった。理由

^(words|I|want|to|include)(?:(?!the|ones|that|should|not|match).)*$

うまくいかないのは、含めたい単語の1つから始めて、含めたくない単語の1つではないもので最後まで続けることを意味するためです。これを修正するには、開始チェックを変更して正の先読みを使用するだけです。

^(?=.*(?:words|I|want|to|include))(?:(?!the|ones|that|should|not|match).)*$

これは、最初からある時点まで、含めたい単語が少なくとも1つあることを確認、元の正規表現のように続行することを意味します。

さらに厳密にするために、単語の境界を使用できます。

^(?=.*\b(?:words|I|want|to|include)\b)(?:(?!\b(?:the|ones|that|should|not|match)\b).)*$

これらはすべて大文字と小文字が区別されることに注意してください。それを変更するには、次を使用できますQRegExp::setCaseSensitivity

于 2015-08-18T08:28:41.893 に答える
1

これを試して:

^(?:(?:(?!\b(?:the|ones|that|should|not|match)\b).|))*?\b(?:words|I|want|to|include)\b(?:(?:(?!\b(?:the|ones|that|should|not|match)\b).|))*$

正規表現の視覚化

Debuggex のデモ(一致する例と一致しない例を含む) を参照してください。

注: 上記は、QRegExp が可変長の先読みをサポートしていることを前提としています - 私はこれを確認していません。

説明:

  1. すべての単語は正確でなければなりません (たとえば、「単語」は含めますが、「剣」や「単語」は含めません) \b
  2. 含めたい単語については、そのうちの少なくとも 1 つが少なくとも 1 回出現することだけが重要です。そのため、検索されるのはそれだけです。
  3. 除外リスト内の単語は、検索対象の単語の前後に表示されることはありません。したがって、その両側に「除外グループ」が必要です。
  4. 除外グループは、この回答で非常によく説明されている方法を使用して実装されます。
  5. 最初の除外グループは*?、非貪欲にするために使用するため、テキスト全体を消費せず、検索対象の単語が見つかるとすぐに停止します。
  6. 正規表現は^...でラップされ$、文字列の一部だけでなく文字列全体がチェック/照合されるようにします。
  7. ?:すべてのグループは、最初の括弧の直後に使用することにより、非キャプチャ グループとしてマークされます。
  8. マッチングはおそらく大文字と小文字を区別しないはずなので、正規表現にはこれを行うための適切なフラグが必要です (例: /i)。
于 2015-08-17T23:09:23.113 に答える
0

必要と思われるものの簡略版:

^(?:(?!ipsum).)*(?:lorem)(?:(?!ipsum).)*$

フォーマット:

^                    # BOS
 (?:
      (?! ipsum )          # Preceding text, but not these words
      . 
 )*
 (?: lorem )          # Text wanted
 (?:
      (?! ipsum )          # Following text, but not these words
      . 
 )*
 $                    # EOS
于 2015-08-18T15:53:07.770 に答える