3

特定の文字列( "ABCD")を除くすべてに一致するJavascript正規表現を作成するにはどうすればよいですか?

/[^ABCD]/文字A、B、C、またはD以外のすべてに一致させたくないことを除いて、次のようなものです。文字列「ABCD」以外のすべてに一致させたいです。

基本的に私はこれを実現させたい:

var myStr = "ABCA ABCB ABCD BCD ABC"
myStr.replace(/!(ABCD)/g,'') // returns ABCD
4

4 に答える 4

5

単純にチェックしABCD、文字列にいくつ存在するかをチェックしてから、次のように新しい文字列を作成します(ケースに適している場合は、スペースを区切り文字として使用できます)。

var res = myStr.match(/ABCD/g);
var str = res ? res.join('') : '';

match()何も見つからない場合に戻るため、三元がありnullます-メソッドがありませんjoin()

于 2012-08-09T22:48:36.003 に答える
3

さて、私は質問を誤解していました。の存在をテストしたいようABCDです。見つかった場合は、文字列全体を次の文字列だけに置き換えますABCD。これはそれを行います:

s = s.replace(/.*(ABCD).*/, '$1');

ただし、文字列がない場合は、文字列は変更されませんABCD。その場合に文字列を削除する場合は、キャプチャをオプションにする必要があります。ただし、正規表現の最初の部分を変更して、キャプチャに「忍び寄る」ようにする必要があります。

s = s.replace(/^(?:(?!ABCD).)*((?:ABCD)?).*$/, '$1');

ABCDそのため、すべての位置でキャプチャを試みる必要があります。(これにより、処理速度が大幅に低下します。この場合は問題になりませんが、この手法を大規模な入力で使用する場合は注意が必要です。)

したがって、純粋な正規表現ソリューションは存在しますが、@bažmegakapaのソリューションの方が好きです。:D


元の答え:

/^(?!ABCD$).*/

これは空の文字列にも一致することに注意してください。ポジティブな要件がある場合は、を必要なものに変更できます.*。たとえば、1つ以上の大文字のASCII文字に一致するが、正確な文字列ABCDには一致しない場合は、次を使用できます。

/^(?!ABCD$)[A-Z]+$/
于 2012-08-09T23:01:12.547 に答える
0

これは、否定演算子を使用せずに、否定を直接拡張したものです。

/^\([^a]\|a[^b]\|ab[^c]\|abc[^d]\)*$\|^a$\|^ab$\|^abc$/

否定演算子をある言語に呼び出すと、否定したい式が上位形式のようなものに変換されます。


これが私がそれをテストした方法です:

@ThinkPad-T420:~$ E='/^\([^a]\|a[^b]\|ab[^c]\|abc[^d]\)*$\|^a$\|^ab$\|^abc$/ p;d'
@ThinkPad-T420:~$ echo abc | sed "$E"
abc
@ThinkPad-T420:~$ echo abcd | sed "$E"
@ThinkPad-T420:~$ echo abcde | sed "$E"
@ThinkPad-T420:~$ echo axbcde | sed "$E"
axbcde
@ThinkPad-T420:~$ echo xxabcde | sed "$E"
@ThinkPad-T420:~$ 
于 2012-08-09T23:25:49.620 に答える
0

これで試してください:

var myStr = "ABCA ABCB ABCD BCD ABC";
var foo = myStr.replace(/\b(?!ABCD\b)\w+\b/g,'').trim(); // returns ABCD
document.write(foo);

出力:ABCD

また:

var myStr = "ABCA ABCB ABCD BCD ABCD ABC";
var foo = myStr.replace(/\b(?!ABCD\b)\w+\b/g,'').replace(/\s/g, '');
document.write(foo);

出力:ABCDABCD

于 2012-08-09T23:30:28.907 に答える