web-dev-qa-db-ja.com

特定の文字列を含まない正規表現

私はこのようなものを持っています

アーバブカアブダ

aでラップされた最小限のグループを選択するために、私はこの/a([^a]*)a/を持っています。

しかし、私はaaでラップされたグループに問題があり、そこでは機能しない/aa([^aa]*)aa/のようなものが必要であり、/aa([^a]*)aa/のような最初のものは使用できません、aの最初の出現で終了するため、これは望ましくありません。

一般的には、not stringと言う方法はありますか?文字を含まない with [^a]

簡単に言えば、私はaaの後にシーケンスaaで終わるaa

76
Jakub Arnold

一般に、特定の文字列を含む正規表現notを記述するのは苦痛です。計算のモデルに対してこれを行う必要がありました-定義するのに十分簡単なNFAを取得し、それを正規表現に減らします。 「cat」を含まないものの表現は約80文字でした。

編集:私はちょうど終わった、はい、それは:

aa([^a] | a[^a])aa

ここ は非常に短いチュートリアルです。以前に素晴らしいものをいくつか見つけましたが、もう見ることができません。

18
Claudiu

Googleの力により、 2007年のブログ投稿 が見つかりました。これは、do n'tを含む文字列に一致する次の正規表現を提供します特定のサブストリング:

^((?!my string).)*$

次のように機能します:文字列を開始しない(?!-負の先読み)0個以上(*)の文字(。)を探し、文字列全体がそのような文字で構成されていることを規定します(^を使用して)および$アンカー)。または別の言い方をすれば:

文字列全体は、指定された文字列を開始しない文字で構成されている必要があります。つまり、文字列には指定された部分文字列が含まれていません。

202
Grey Panther

必要なのは消極的な量指定子だけです。

regex: /aa.*?aa/

aabbabcaabda   => aabbabcaa

aaaaaabda      => aaaa

aabbabcaabda   => aabbabcaa

aababaaaabdaa  => aababaa, aabdaa

ネガティブルックアヘッドも使用できますが、この場合、同じことを達成するためのより冗長な方法です。また、gpojdが作成したよりも少し複雑です。先読みは、ドットが次の文字を消費する前に各位置に適用する必要があります。

/aa(?:(?!aa).)*aa/

Claudiuとfinnwによって提案されたアプローチに関しては、センチネル文字列が2文字の長さであれば問題なく動作しますが、(Claudiuが認めたように)長い文字列では扱いにくいです。

10
Alan Moore
/aa([^a]|a[^a])*aa/
7
finnw

それが標準の構成であるかどうかはわかりませんが、「ネガティブな先読み」(引用符なしで「?!」と書く)を確認する必要があると思います。受け入れられたものを含め、このスレッドのすべての答えよりもはるかに簡単です。

例:正規表現: "^(?! 123)[0-9] *\w"数字で始まり、その後に文字が続くすべての文字列をキャプチャします。「これらの数字」が123の場合を除きます。

http://msdn.Microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (Microsoftページ、しかし非常に包括的な)先読み/後読み

PS:それは私(.Net)に適しています。しかし、私が何か間違っている場合は、お知らせください。この構成は非常にシンプルで効果的だと思うので、受け入れられた答えに驚いています。

6
AFract

次のコードを置き換える必要がありましたが、GETパラメーターを1つを除くJSファイルへのすべての参照に追加しました。

<link rel="stylesheet" type="text/css" href="/login/css/ABC.css" />
<script type="text/javascript" language="javascript" src="/localization/DEF.js"></script>
<script type="text/javascript" language="javascript" src="/login/jslib/GHI.js"></script>
<script type="text/javascript" language="javascript" src="/login/jslib/md5.js"></script>
sendRequest('/application/srvc/EXCEPTION.js', handleChallengeResponse, null);
sendRequest('/application/srvc/EXCEPTION.js",handleChallengeResponse, null);

これは使用されるマッチャーです:

(?<!EXCEPTION)(\.js)

これは、「。js」のすべての出現を検索し、「EXCEPTION」文字列が先行する場合、結果配列からその結果を破棄します。それはネガティブな後読みと呼ばれます。これを行う方法を見つけることに1日を費やしたので、共有する必要があると考えました。

4
jsaddwater
".*[^(\\.inc)]\\.ftl$"

Javaでは、「。ftl」で終わるすべてのファイルが見つかりますが、「。inc.ftl」で終わるわけではありません。これはまさに私が望んでいたものです。

2
twopigs