2010-12-08 4 views
4

Perlスタイルの正規表現を使用すると、特定のパターンではないものを探すことはできますか?正規表現を使用して特定のパターンでないものを探す方法

たとえば、[^abc]は、aでもbでもcでもない単一の文字を検索します。

ただし、1文字以上の長さを指定することはできますか?
たとえば、次の文字列では、トップレベルのドメイン名ではなく、大文字を含まない最初の単語、または3〜10文字のようなさらに複雑なルールを検索したいと考えています。私の例では、これは"abcd"する必要があります:

net com org edu ABCE abcdefghijklmnoparacbasd abcd 

答えて

5

あなたのように、負の先読みアサーションを使用してそれを行うことができます:だから

^     - Start anchor 
$     - End anchor 
(?:net|com|org|edu) - Alternation, matches net or com or org or edu 
(?!regex)   - Negative lookahead. 
         Matches only if the string does not match the regex. 

^(?!(?:net|com|org|edu)$)(?!.*[A-Z])[a-z]{3,10}$ 

See it

説明部分(?!(?:net|com|org|edu)$)は、入力が最高レベルの1つでないことを保証しますelドメイン。

部分(?!.*[A-Z])は、入力に大文字が含まれないようにします。

一部[a-z]{3,10}$は、入力が少なくとも3および[最大10

+0

先読み(および他のいくつかの基本的な正規表現を)見て説明して偉大なビデオがあります:http://net.tutsplus.com/tutorials/other/how-to-use-lookaheads-and-look-in-your-regular-expressions/ – Haroldo

+0

'.':'(?![^ AZ] * [AZ])の代わりに補完を使用する方がよい。 – Gumbo

4

ちょうど「一致しない」演算子を使用する長さであることを保証します!〜

だからあなたの式を作成し、その変数を参照してくださいそれと一致していません:

if ($var !~ /abc/) { 
    ... 
} 
0

私見その正規表現でいくつかのマッチングとPerlでいくつかのチェックを行うことが容易になります。トップレベルドメインが多いところで

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $s = "net com org edu ABCE abcdefghijklmnoparacbasd abcd"; 

# loop short words (a-z might not be what you want though) 
foreach($s =~ /(\b[a-z]{3,10}\b)/g){ 
    print $_, "\n" if is_tpl($_); 
} 

..

ここ
+0

アサーションや単純なネガティブな正規表現がもっと有効なのはおそらくこの –

+0

です。もっと単純なreg.expのほうがずっと高速で、ヒット数が少ないのでなければ... –

関連する問題