web-dev-qa-db-ja.com

特定の文字列定数を除外する正規表現

正規表現を使用して、特定の文字列定数以外の任意の文字列に一致させることができますか?特定の文字列定数を1つだけ除外することは可能ですか?よろしくお願いします。

105
V Govind

ネガティブな先読みアサーションを使用する必要があります。

(?!^ABC$)

たとえば、次を使用できます。

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

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

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

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

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

そうでなければ、あなたは何か悪いことをしなければなりません:

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

基本的には、「fで始まる場合、残りは何でも構いません。f、非oで始まる場合、残りは何でも構いません。 foで始まります。次の文字は別のo "にはしないでください。

4
derobert

ネガティブな先読み、または次のようなものを使用できます。

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

多分それは少し単純化されるかもしれません。

4
Adam Crume

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

4
Steve Wortham

この正規表現を試してください:

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

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

  1. 任意の3文字未満
  2. 正確に3文字、一方
    • 最初がAではない、または
    • 最初はAですが、2番目はBではありません。または
    • 最初はA、2番目はBですが、3番目はCではありません
  3. 任意の3文字以上
2
Gumbo