正規表現を使用して、特定の文字列定数以外の任意の文字列に一致させることができますか?特定の文字列定数を1つだけ除外することは可能ですか?よろしくお願いします。
ネガティブな先読みアサーションを使用する必要があります。
(?!^ABC$)
たとえば、次を使用できます。
(?!^ABC$)(^.*$)
これがエディターで機能しない場合は、これを試してください。 Rubyおよびjavascriptで動作することがテストされています。
^((?!ABC).)*$
これは、正規表現エンジンが特別にサポートしていない限り、簡単ではありません。最も簡単な方法は、たとえば次のように否定一致オプションを使用することです。
$var !~ /^foo$/
or die "too much foo";
そうでなければ、あなたは何か悪いことをしなければなりません:
$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
or die "too much foo";
基本的には、「f
で始まる場合、残りは何でも構いません。f
、非o
で始まる場合、残りは何でも構いません。 fo
で始まります。次の文字は別のo
"にはしないでください。
ネガティブな先読み、または次のようなものを使用できます。
^([^A]|A([^B]|B([^C]|$)|$)|$).*$
多分それは少し単純化されるかもしれません。
.NETでは、次のようにグループ化を活用できます。
http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31
あなたはそれに気付くでしょう:
(ABC)|(.)
2番目のグループのABCを除くすべてを取得します。各グループを括弧で囲みます。 (ABC)はグループ1、(。)はグループ2です。
したがって、次のような2番目のグループを置き換えるだけで取得できます。
$2
または、.NETでRegexクラス内のGroupsコレクションを見て、もう少し制御してください。
他のほとんどの正規表現の実装でも同様のことができるはずです。
更新:ここでこれを行うためのはるかに速い方法を見つけました: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e
まだグループ化を使用しています(グループ化を使用しない方法は見つかりません)。ただし、この方法は最初の方法よりも10倍以上高速です。
この正規表現を試してください:
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
次の3つのケースについて説明します。
A
ではない、またはA
ですが、2番目はB
ではありません。またはA
、2番目はB
ですが、3番目はC
ではありません