正規表現:特定のパターン以外のすべてに一致


310

私はすべてを一致させることができる正規表現必要があるが、特定のパターンで始まる文字列(特にindex.php、何次の、などindex.php?id=2342343


そして、一致させたくない特定のパターンは何ですか?
ドミニクロジャー

2
文字列がパターンに一致せず、文字列がそれに一致する場合に何かを実行できない理由はありますか?
Thomas Owens、


@ThomasOwens:場合によります。式のどの部分を否定するかによって異なります。式全体を否定する場合は、ポイントを得ます。たとえば、「文字列に「Bruce」が部分文字列として含まれていない場合は、何かを行う」というコードを記述したい場合は、単純に/ Bruce /を使用し、正規表現の外側でifステートメントに否定を挿入します。 。しかし、一部の部分式を否定したい場合もあります。たとえば、firstname lastnameのようなものを探しているとします。firstnameはBruce、lastnameはXYZを除くすべてです。XYZはBruceと呼ばれる有名人の姓です。
mathheadinclouds

回答:


250

正規表現の専門家ではありませんが、最初から負の先読みを使用できます。たとえば、で^(?!foo).*$始まるものとは一致しませんfoo


7
grepで-Pを使用して先読みを有効にします。
Seppo Enarvi 2016年

:「foo」というか、「バー」は、ご希望の動作で一致していない場合は、この答えをチェック stackoverflow.com/a/2404330/874824を
dave_k_smith

15
この答えは間違っています、簡単なテストはそれを示しています。私は何を意味することだと思います^((?!foo).)*$stackoverflow.com/a/406408/3964381
ギラッドmayani

4
使用した記号とその使用理由を教えてください。
rotimi-best

339

正規表現:すべてを一致しますが

デモノート:改行\nは、隣接する行への一致オーバーフローを回避するために、デモの否定された文字クラス内で使用されます。個々の文字列をテストする場合は必要ありません。

アンカーノート:多くの言語では、を使用\Aして文字列の明確な開始を定義し、\z(Python \Zでは、JavaScriptでは$OK)文字列の最後を定義します。

付記:多くのフレーバー(POSIX、TRE、TCLを除く)では、改行文字以外の.すべての文字に一致します。が対応するDOTALL修飾子(/sPCRE / Boost / .NET / Python / Javaおよび/mRuby)を使用し.て、改行を含むすべての文字と一致することを確認してください。

バックスラッシュノート:あなたは(のようなエスケープシーケンスを許可するC文字列のパターンを宣言しなければならない言語では\n、あなたはエンジンが(リテラル文字として扱うことができるように特殊文字をエスケープバックスラッシュを倍増する必要が改行のために)例えばJavaで、world\.なりますとして宣言する"world\\."か、文字クラスを使用します:)"world[.]"。生の文字列リテラル(Python r'\bworld\b')、C#の逐語的文字列リテラル@"world\."、またはなどのスラッシュ文字列/正規表現リテラル表記を使用し/world\./ます。


おめでとう!「ある文字列に等しい(ではない)文字列」の場合、の例で^(?!foo$)は、式が機能するためにドル記号が括弧内にある必要があるのはなぜですか?^(?!foo)$同じ結果が得られると期待していましたが、そうではありません。
Grant Humphries、2017年

3
@GrantHumphries:$アンカーが先読み内にある場合、それは条件の一部であり、そのゼロ幅アサーションの一部です。のように外側にある場合^(?!foo)$、それは文字列の開始直後に文字列の終了を必要とする消費パターンの一部となり、常にtrueを返すため、負の先読みは無関係になります(文字列の終了後にテキストはありません)は言うまでもありませんfoo)。したがって、^(?!foo$)その後に続いてfooいない文字列の先頭と、それに続いて文字列の末尾が一致します。^(?!foo)$空の文字列に一致します。
WiktorStribiżew2017年

@ robots.txtこれらのコメントを削除してください。あなたはXY質問をしている。文字クラスは単一の文字と一致することを意図しており、それらを使用して文字のシーケンスを定義する方法はありません。おそらく、文字列の先頭とcotor の最初の出現の間の部分文字列を見つけlan、のように一致を削除する必要がありregex.replace(myString, "^.*?(?:cot|lan)\s*", "")ます。
WiktorStribiżew19年

親愛なるウィクター。あなたは私の質問を閉じましたが、あなたのリンクされた答えは失敗します。私は私の質問に更新しましたstackoverflow.com/questions/60004380/...
MonsterMMORPG

たとえば、この例では、リンクされた回答が失敗します。「パッケージ<!-and web page <!-asdasasdas->エディターは現在使用しています-> Lorem
Ipsum

259

^文字セットの先頭にa を置くと、それらの文字以外のすべてと一致します。

[^=]*

すべてに一致しますが =


55
それは事実ですが、一度に1つの文字しか処理しません。2つ以上の文字のシーケンスを除外する場合は、他のレスポンダが言ったように、否定先読みを使用する必要があります。
アランムーア

完全な解決策は、パターン内の望ましくない文字以外を削除します。ありがとう
サーミーセルフ

@アラン、「...ネガティブルックアヘッドを使用する必要があります...」は正しくありませんが、ウィクトールが2016
ケアリースウェーヴランド

6

ちょうど一致し/^index\.php/、それと一致するものはすべて拒否します。


おそらく書かれていstr !~ /\Aindex\.php/ます。
Cary Swoveland

6

Pythonでは:

>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>

3
「index_php」または「index#php」を拒否します。

1

私がする正規表現でき必要なすべてのものと一致するが、除く外で始まる文字列を index.php特定のパターン(特にindex.phpをし、以下のものを、index.phpのような?ID = 2342343)

メソッドExecを使用する

    let match,
        arr = [],
        myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;

    var str = 'http://regular-viragenia/index.php?id=2342343';

    while ((match = myRe.exec(str)) != null) {
         arr.push(match[1]);
    } 
    
    console.log(arr);

var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);

または他のマッチ

let match,
            arr = [],
            myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;

        var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';

        while ((match = myRe.exec(str)) != null) {
             arr.push(match[1]);
        } 

        console.log(arr);


-13

正規表現を使用しないのはどうですか:

// In PHP
0 !== strpos($string, 'index.php')

11
OPは特に正規表現を要求しました...これが役立つかどうかはわかりません!(grepたとえば、コマンドライン、Perl / Python /その他の言語、またはテキストエディターなどで「すべての行に対してこの正規表現を実行する」コマンドを使用している可能性があります)
rinogo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.