指定された文字列を除くすべてに一致


118

次の正規表現が「赤」、「緑」、または「青」に一致することを知っています。

red|green|blue

指定されたいくつかの文字列を除くすべてに一致させる簡単な方法はありますか?


1
正規表現のすべての種類がこれを実行できるわけではありません。どんな環境で働いていますか?Java?Perl?。ネット?いくつかのC / C ++正規表現ライブラリ?RDBMS?
FrustratedWithFormsDesigner 2010年

8
何をしたいかを言うのではなく、単に「一致」操作の意味を逆にすることができます。これは、一致しない部分を抽出しようとする場合には役に立ちませんが、除外された文字列が存在しないかどうかをテストすることは機能if (!s.match(/red|green|blue/)) ... します。上記は、規範的な例ではなく、一般的な例と見なしてください。
tvanfosson

回答:


153

文字列が赤でも緑でも青でもないことを確認したい場合、caskeyの答えはそれです。しかし、しばしば望まれるのは、ラインのどこにも赤、緑、青が含まれていないことを確認することです。そのためには、正規表現をアンカーし、否定先読みに^含めます.*

^(?!.*(red|green|blue))

また、「engine」という単語が含まれているが、これらの色は含まれていない行が必要だとします。

^(?!.*(red|green|blue)).*engine

.*正規表現の先頭に因数分解できると思うかもしれません:

^.*(?!red|green|blue)engine     # Does not work

できません。それが機能するには、の両方のインスタンスが.*必要です。


48

言語に依存しますが、一般的にそうすることができる否定的なアサーションがあります:

(?!red|green|blue)

(構文修正のおかげで、上記は有効なJavaおよびPerl、YMMVです)


2
@caskey、完全な答えは私のとあなたの組み合わせです。それらをマージしたい場合は、私が削除します。
ウェインコンラッド

13
この答えは、少しだけ説明すれば、はるかに役立つでしょう。例:「何をしますか?」そして「!」平均?なぜキャプチャグループが必要なのですか?
Lii 14

それも有効なPythonです。
Joe Mornin、2015年

これをDelphi regExライブラリで使用すると、次のようにしか機能しません:^(?! red | green | blue)。regex101.comでのテストにも当てはまります。上記のタイプミスに^がないのですか、それとも実際にJava / Perl / Pythonのように機能しますか?
Peter

32

与えられた文字列以外のものとのマッチング

特定の文字列以外のすべてに一致させたい場所で文字列全体に一致させたい場合は、次のように実行できます。

^(?!(red|green|blue)$).*$

これは、赤、緑、青で開始および終了できない文字列の先頭から一致を開始し、それ以外の文字列の末尾に一致することを示しています。

ここで試すことができます:https : //regex101.com/r/rMbYHz/2

これは、否定先読みをサポートする正規表現エンジンでのみ機能することに注意してください。


23

否定的な先読みは必要ありません。実際の例があります:

/([\s\S]*?)(red|green|blue|)/g

説明:

  • [\s\S] -任意の文字と一致します
  • * -0から前のグループの無制限に一致
  • ? -できるだけ一致しない
  • (red|green|blue|) -この単語のいずれかに一致するか、何も一致しない
  • g -繰り返しパターン

例:

whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite

になります:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

試して: regex101.com


4
[\ s \ S]をドットに置き換えることで、ステップ数を大幅に減らすことができます。どうやら他のすべての例が各単語を個別にキャプチャする理由が非常に混乱しました。この方法は、正規表現のステップが少し多くなりますが、必要な後処理ははるかに少なくなります。
Zatronium 2016

3
しかし、これはマッチング(テキスト検証)を行わず、置換時に指定されたテキストを削除するだけです。
Marek R

このソリューションでは、既知の単語の後のテキストの最終チャンクは出力されません。だから、速度を比較する必要はありません、それはただ間違っています。
WiktorStribiżew

@WiktorStribiżewが修正されました。
hlcs

10

私も同じ質問をしました。提案された解決策はほとんど機能していたのですが、いくつかの問題がありました。最後に、私が使用した正規表現は次のとおりです。

^(?!red|green|blue).*

Javascriptと.NETでテストしました。

。*を次のように否定先読み内に配置しないでください。 anothergreen "は)


3

任意のテキストに一致するが、パターンに一致するものは通常、正規表現パターンで文字列を分割することで実現されます

  • - Regex.Split(text, @"red|green|blue")または、空の値を取り除くにはRegex.Split(text, @"red|green|blue").Where(x => !string.IsNullOrEmpty(x))デモを参照)
  • - Regex.Split(text, "red|green|blue")または、空のアイテムを削除するにはRegex.Split(text, "red|green|blue").Where(Function(s) Not String.IsNullOrWhitespace(s))デモ、またはLINQがサポートされているこのデモを参照)
  • - text.split(/red|green|blue/)gここで修飾子を使用する必要はありません!)(空の値を取り除くには、を使用text.split(/red|green|blue/).filter(Boolean))、デモを参照
  • - text.split("red|green|blue")、または-すべての後続の空の項目を保持するにtext.split("red|green|blue", -1)は-を使用するか、またはすべての空の項目を削除するには、より多くのコードを使用してそれらを削除しますデモを参照)
  • -Javaと同様に、text.split(/red|green|blue/)すべての後続項目の使用を取得text.split(/red|green|blue/, -1)し、すべての空の項目の使用を削除しますtext.split(/red|green|blue/).findAll {it != ""})デモを参照)
  • - text.split(Regex("red|green|blue"))または、空白のアイテムを削除するtext.split(Regex("red|green|blue")).filter{ !it.isBlank() }には、を使用して、デモを参照してください
  • - text.split("red|green|blue")、または後続のすべての空のアイテムを保持するには、を使用text.split("red|green|blue", -1)し、すべての空のアイテムを削除するには、を使用しますtext.split("red|green|blue").filter(_.nonEmpty)デモを参照)
  • - text.split(/red|green|blue/)、空の値を取り除くには.split(/red|green|blue/).reject(&:empty?)(および先頭と末尾の両方の空の項目を取得するに-1は、2番目の引数として使用します.split(/red|green|blue/, -1))(デモを参照)
  • - my @result1 = split /red|green|blue/, $text;、またはすべての末尾に空のアイテムがあるmy @result2 = split /red|green|blue/, $text, -1;、または空のアイテムがないmy @result3 = grep { /\S/ } split /red|green|blue/, $text;デモを参照)
  • - preg_split('~red|green|blue~', $text)またはpreg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)空のアイテムを出力しません(デモを参照)
  • - re.split(r'red|green|blue', text)または、空のアイテムを削除するにはlist(filter(None, re.split(r'red|green|blue', text)))デモを参照)
  • -をregexp.MustCompile("red|green|blue").Split(text, -1)使用します。空のアイテムを削除する必要がある場合は、このコードを使用しますGoデモを参照してください。

:パターンにキャプチャグループが含まれている場合、正規表現の分割関数/メソッド、追加のオプションによっても動作が異なる場合があります。その場合は、適切な分割方法のドキュメントを参照してください。


0

「赤」を除くすべて

var href = '(text-1) (red) (text-3) (text-4) (text-5)';

var test = href.replace(/\((\b(?!red\b)[\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

「赤」を除くすべて

var href = '(text-1) (frede) (text-3) (text-4) (text-5)';

var test = href.replace(/\(([\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = p1.replace(/red/g, '');
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.