正規表現を使用して、特定の文字列定数 (つまり"ABC"
) 以外の任意の文字列に一致させることはできますか?
特定の文字列定数を 1 つだけ除外することはできますか?
正規表現を使用して、特定の文字列定数 (つまり"ABC"
) 以外の任意の文字列に一致させることはできますか?
特定の文字列定数を 1 つだけ除外することはできますか?
否定先読みアサーションを使用する必要があります。
(?!^ABC$)
たとえば、次のように使用できます。
(?!^ABC$)(^.*$)
これがエディターで機能しない場合は、これを試してください。ruby と javascript で動作することがテストされています。
^((?!ABC).)*$
.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-34e0c5080e03
まだグループ化を使用しています (グループ化を使用しない方法が見つかりません)。しかし、この方法は最初の方法よりも 10 倍以上高速です。
正規表現エンジンが特別にサポートしていない限り、これは簡単ではありません。最も簡単な方法は、次のような否定一致オプションを使用することです。
$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]|$)|$)|$).*$
たぶん、それは少し単純化されるかもしれません。
次の正規表現を試してください。
^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$
次の 3 つのケースについて説明します。
A
、またはA
が 2 つ目はそうではないB
、またはA
、2 番目B
は 、3 番目はそうではありませんC