162

正規表現を使用して、特定の文字列定数 (つまり"ABC") 以外の任意の文字列に一致させることはできますか?

特定の文字列定数を 1 つだけ除外することはできますか?

4

5 に答える 5

186

否定先読みアサーションを使用する必要があります。

(?!^ABC$)

たとえば、次のように使用できます。

(?!^ABC$)(^.*$)

これがエディターで機能しない場合は、これを試してください。ruby と javascript で動作することがテストされています。

^((?!ABC).)*$
于 2009-09-08T17:28:40.170 に答える
8

.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 倍以上高速です。

于 2009-09-08T18:33:27.467 に答える
7

正規表現エンジンが特別にサポートしていない限り、これは簡単ではありません。最も簡単な方法は、次のような否定一致オプションを使用することです。

$var !~ /^foo$/
    or die "too much foo";

そうでない場合は、何か悪いことをする必要があります。

$var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/
    or die "too much foo";

それは基本的に「非で始まる場合、残りは何でもかまいません。非fで始まる場合、残りは何でもかまいません。それ以外の場合、次の文字は別の文字ではないほうがよい」.fofoo

于 2009-09-08T17:26:41.437 に答える
6

否定先読み、または次のようなものを使用できます。

^([^A]|A([^B]|B([^C]|$)|$)|$).*$

たぶん、それは少し単純化されるかもしれません。

于 2009-09-08T17:31:16.017 に答える
4

次の正規表現を試してください。

^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$

次の 3 つのケースについて説明します。

  1. 任意の3文字以内
  2. ちょうど 3 文字
    • 1 つ目は not A、または
    • 1 つ目はあるAが 2 つ目はそうではないB、または
    • 1 番目はA、2 番目Bは 、3 番目はそうではありませんC
  3. 任意の 3 文字以上
于 2009-09-08T21:07:55.233 に答える