特定の文字列( "ABCD")を除くすべてに一致するJavascript正規表現を作成するにはどうすればよいですか?
/[^ABCD]/
文字A、B、C、またはD以外のすべてに一致させたくないことを除いて、次のようなものです。文字列「ABCD」以外のすべてに一致させたいです。
基本的に私はこれを実現させたい:
var myStr = "ABCA ABCB ABCD BCD ABC"
myStr.replace(/!(ABCD)/g,'') // returns ABCD
特定の文字列( "ABCD")を除くすべてに一致するJavascript正規表現を作成するにはどうすればよいですか?
/[^ABCD]/
文字A、B、C、またはD以外のすべてに一致させたくないことを除いて、次のようなものです。文字列「ABCD」以外のすべてに一致させたいです。
基本的に私はこれを実現させたい:
var myStr = "ABCA ABCB ABCD BCD ABC"
myStr.replace(/!(ABCD)/g,'') // returns ABCD
単純にチェックしABCD
、文字列にいくつ存在するかをチェックしてから、次のように新しい文字列を作成します(ケースに適している場合は、スペースを区切り文字として使用できます)。
var res = myStr.match(/ABCD/g);
var str = res ? res.join('') : '';
match()
何も見つからない場合に戻るため、三元がありnull
ます-メソッドがありませんjoin()
。
さて、私は質問を誤解していました。の存在をテストしたいよう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]+$/
これは、否定演算子を使用せずに、否定を直接拡張したものです。
/^\([^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:~$
これで試してください:
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