83

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

アッバブカブダ

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

しかし、 aaでラップされたグループに問題があり、動作しないようなものが必要で /aa([^aa]*)aa/、最初のような を使用できませ/aa([^a]*)aa/ん。 .

一般に、文字列を含まないと言うのと同じように、文字列を含まない言う[^a]方法はありますか?

簡単に言うと、aaの後にシーケンスaa以外の任意の文字が続き、aaで終わる必要があります。

4

7 に答える 7

217

Googleの力で、特定の部分文字列を含まない文字列に一致する次の正規表現を提供する2007年のブログ投稿を見つけました。

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

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

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

于 2010-03-05T13:39:50.977 に答える
19

一般に、特定の文字列を含まない正規表現を書くのは面倒です。計算モデルのためにこれを行う必要がありました。定義が簡単な NFA を取得し、それを正規表現に変換します。「猫」を含まないものの表現は、約 80 文字の長さでした。

編集:私は終わったばかりで、はい、それは:

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

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

于 2009-04-04T19:30:55.197 に答える
10

必要なのは、気が進まない量指定子だけです。

regex: /aa.*?aa/

aabbabcaabda   => aabbabcaa

aaaaaabda      => aaaa

aabbabcaabda   => aabbabcaa

aababaaaabdaa  => aababaa, aabdaa

否定先読みを使用することもできますが、この場合は、同じことをより冗長な方法で実現するだけです。また、gpojd が作成したよりも少しトリッキーです。ドットが次の文字を消費できるようになる前に、先読みを各位置に適用する必要があります。

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

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

于 2009-04-05T07:32:50.500 に答える
7
/aa([^a]|a[^a])*aa/
于 2009-04-04T19:24:20.363 に答える
6

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

例 : 正規表現 : "^(?!123)[0-9]*\w" "これらの数字" が 123 でない限り、数字で始まり文字が続く文字列をキャプチャします。

http://msdn.microsoft.com/en-us/library/az24scfc%28v=vs.110%29.aspx#grouping_constructs (マイクロソフトのページですが、非常に包括的な) 先読み/後読みについて

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

于 2014-11-21T11:27:02.157 に答える
4

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

<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);

これは使用されるMatcherです:

(?<!EXCEPTION)(\.js)

それは、「.js」のすべての出現を探し、「EXCEPTION」文字列が前にある場合は、結果配列からその結果を破棄します。それは否定的な後読みと呼ばれます。これを行う方法を見つけるのに1日を費やしたので、共有する必要があると思いました.

于 2012-11-22T12:18:51.067 に答える
3
".*[^(\\.inc)]\\.ftl$"

Java では、「.ftl」で終わるが「.inc.ftl」で終わらないすべてのファイルが検索されます。これはまさに私が望んでいたことです。

于 2011-12-01T19:17:13.187 に答える