2011-01-10 13 views
2

私はOracle Regular Expressionを使用していますが、いくつかの文字列を一致させたい場合は、別の文字列と別の文字列を別の文字列に一致させたいと思います。Regex to match test <not ABC> test

たとえば、「testZZZtest」と「testAAAestest」は一致させたいが、「testABCtest」も「test bla bla ABC bla bla test」も一致させたくない。以下のように

私はパターンをしようとしている '[^ ABC] *テストのテスト':

select regexp_instr('bla bla bla testAZZtest bla bla bla', 'test[^ABC]*test') from dual 

が、それは仕事をdoes't(それは答える0、それが一致しないこと)。私がしようとするので、「AZZ」内の「A」は、問題となっているようだ:

select regexp_instr('bla bla bla testZZZtest bla bla bla', 'test[^ABC]*test') from dual 

私は、元の文字列のtestZZZtestの位置で答え13を得ました。

確かに私は何か不足していますが、私は問題を見つけることができません。否定先読みに関するいくつかの情報を探したが、私は、Oracleで動作しない構文を得た:

http://www.regular-expressions.info/lookaround.html

+0

Oracleは独自の正規表現構文を発明しない限り、 '[^ ...]'は否定文字グループです。つまり、省略記号の代わりに指定されていない1文字と一致します。 – delnan

答えて

2

はこれを試してください:あなたの試み、[^ABC]*試合0個以上の文字で

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

をこれはA、B、またはCではありません。これはZZZ(A、BまたはCはありません)と一致し、AZZ(Aを含む)と一致しなかった理由を説明します。

+0

それは動作しません:(、testAZZtestと一致しません。 – caraca

+0

@caraca申し訳ありません、それは私の間違いでした - 上記のアップデートは[テスト済み]です(http://www.rubular.com/r/IDI8v5GlyL)。 – marcog

+0

ありがとう@marcog !!今それはうまく動作します! – caraca

関連する問題