2012-03-20 9 views
3

1桁以外のすべての正規表現は一致しますか一致しませんか?1桁以外のすべてに一致する正規表現

  • stack
  • stack overflowが一致しなければならないと一致する必要があり、例えば

  • 12389237一致しかしべき
  • 2べきない一致

私は^[^\d]+$ですが、明らかにそれは私の3番目の条件と一致しません。

EDIT:

はこれが道でPHPのためです。

+2

これは1桁でもないので空文字列にも一致するはずですか? – Kaivosukeltaja

+0

これがPHPの場合、なぜperlタグを持っていますか? – TLP

+0

@Kaivosukeltajaうん、1桁以外は何でも。乾杯。 –

答えて

4

ブレークそれを。数字でない単一の文字にマッチ、または長さ2以上の任意の文字列に一致する次のいずれか

^(\D|.{2,})$ 
+0

あなたは疑問を誤解してしまいましたか? – tchrist

+0

@tchrist:なぜですか?それは要求された基準に一致するようです。 – VeeArr

+0

あなたのパターンは4行目と一致しています。 – tchrist

0

(空白を含む)文字列、および単一の数字ではない任意の数のマッチする次の正規表現:ダウン2例に

/^[a-zA-z\s]+|[0-9]{2,}$/gm 

RegExr Code

+1

それは彼が言わなければならないことにはうまくいかないでしょう。さらに、大括弧で囲まれた唯一の '\ D'を囲む理由はありません。 – tchrist

+0

@tchristあなたが正しいです、私は私の答えを変更しました。 – PenguinCoder

+0

あなたの '/ g'や'/m'が意味をなさないかどうかわかりません。あなたは何を考えているのですか? – tchrist

2

最も簡単には、通常のプログラムロジックを使用して、孤立桁の一致を否定するだけである。

! /(?<!\d)\d(?!\d)/ 

ことも可能で、単一のパターンでエンコーディングが、迷惑:/x経由

/^(?!.*(?<!\d)\d(?!\d))/ 

または広がっ:

/^(?! .* (?<! \d) \d (?! \d))/x 

や各種複数行の状況に対して絶縁さ:私は定期的に正の一致を否定することが容易であることを特徴とする理由

/\A (?! .* (?<! \d) \d (?! \d))/sx 

を参照してください?

ここでのテストプログラムです:

use v5.12; 
while (<DATA>) { 
    my $got =/^ (?! .* (?<! \d) \d (?! \d))/x; 
    print $got ? "PASS" : "FAIL"; 
    print ": ", $_; 

} 
__END__ 
"stack" should match 
"stack overflow" should match 
"12389237" should match but 
"2" should not match 

生成:

PASS: "stack" should match 
PASS: "stack overflow" should match 
PASS: "12389237" should match but 
FAIL: "2" should not match 

EDIT

をあなたがあなたの質問をmisformatted場合、あなたは単に文字列であることを意味している場合は、実際に

stack 
stack overflow 
12389237 
2 

代わりに、その後、行う簡単な事は一桁戦を否定することはまだです:慎重

! /^\d$/ 

以上、

! /\A\d\z/ 

パターンにɴᴏᴛ操作を構築しています決して美しくない。

/^ (?! \d $)/x 

ここで別のテストプログラムです:

use v5.12; 
while (<DATA>) { 
    my $got = /^ (?! \d $)/x; 
    print $got ? "PASS" : "FAIL"; 
    print ": $_"; 

} 
__END__ 
stack 
stack overflow 
12389237 
2 

報告:

PASS: stack 
PASS: stack overflow 
PASS: 12389237 
FAIL: 2 
+0

'\ z'と' $ 'の区別は、' \ A'と '^'の区別よりも重要です。 AFAIKは、文字列の正規表現スニペットを/ mコンテキストに挿入すると、違いが生じます。 – ysth

+1

@ysthもう悲しいです。レキシカルスコープの 'use re"/msx "プラグマの場合でも、正しく動作することを保証する必要があります。 – tchrist

+0

ありがとうございます。十分なロープのように聞こえます:) – ysth

2

が試合を反転、1桁の数字と一致しません:

!/^\d\z/ 

それともで正規表現が否定的な先読み:

/^(?!\d\z)/ 
+0

代わりに '\ Z'または' $ 'を使いたいかもしれません。さもなければ、それは私がポストしようとしていたものである。 – TLP

+0

文字列の最後の前に改行を許可したい場合は、 '\ 2"の代わりに '$'や '\ Z 'を使うことができます。 – Qtax

0
while(my $line = <DATA>){ 
    chomp $line; 
    if ($line !~ /^\d{1}$/) { 
     print "$line match\n"; 
    } 
    else { 
     print "$line NOT match\n"; 
    } 
} 

__DATA__ 
stack 
stack overflow 
12389237 
2 

結果:

perl regex.pl 
stack match 
stack overflow match 
12389237  match 
2  NOT match 
+0

'{1}'は明示的であることを除いてすべての点で重複しています。 – TLP

1

は、それが正規表現である必要はありますか? PHPの場合はこのようになります

is_integer($string) && $string < 10 
+1

'未定義サブルーチン&main :: is_integer at at..' – TLP

+0

申し訳ありません、PHP用perlでない – safarov

+0

それは悪い考えではなく、単にperlの解決策ではありません。 – TLP

関連する問題