2012-03-10 16 views
2

私は次の式を使用しています。正規表現はネットでは動作しません

W \ [A-C] {3}

を目的は、それらの前に任意の文字を持っていないAとCの間に何の3つの文字が一致することです。したがって、入力 "ABC"では一致しますが、 "DABC"では一致しません。

さまざまなオンライン正規表現ツール(たとえば、http://gskinner.com/RegExr/)を使用してこの式を試してみると、完全に機能します。 asp.net RegularExpressionValidatorまたはRegExクラスで使用しようとすると、何も一致しません。

私は、マッチの前に文字を許可しないさまざまな方法を試しました。例えば。

[^\w] and [^a-zA-Z0-9] 

すべてがオンラインツールで動作しますが、.netでは動作しません。

このテストは失敗しますが、その理由はわかりません。

[Test] 
public void RegExWorks() 
{ 
    var regex = new Regex("\\W[A-C]{3}"); 
    Match match = regex.Match("ABC"); 
    Assert.IsTrue(match.Success); 
} 

答えて

3

どのようにこのようなものについて:

^[A-C]{3} 

それは簡単ですが、あなたが求めているものを合わせているようだ、と私はrubular.comでそれをテストします。NET

+0

ええ、あなたの権利は機能します。しかし、奇妙なことに、私はhttp://gskinner.com/RegExr/で試してみるとうまくいかない - 3つの答えのうちどれが一番良いのか分からないのですか?彼らはすべて働いています – Robbie

+0

これはかなり標準的なreg exですので、私はそこではうまくいかないのか分かりません。もしあなたがreg ex siteに行ったら、それは... –

3

問題は、あなたが\Wの文字があるようにを必要とということです。それを修正するにはalterationを使うか、無効な文字がないことを確認するためにlookbehindを使います。

改造:

(?:\W|^)[A-C]{3} 

しかし、私は否定後読み好む:(gymbrallsの答えのように)

(?<!\w)[A-C]{3} 

\bが、この場合には、単に(?<!\w)を意味しており、(?<!\w)(?=\w)|(?<=\w)(?!\w)の略です同等である。

[Test] 
public void RegExWorks() 
{ 
    var regex = new Regex("\\b[A-C]{3}"); 
    Match match = regex.Match("ABC"); 
    Assert.IsTrue(match.Success); 
} 

\\b試合:

var regex = new Regex(@"(?<!\w)[A-C]{3}"); 
+0

感謝の男!それが修正されました。 – Robbie

2

をあなたがしようとして検討する必要があります。

また、C#であなたが例えば、物事を脱出倍増する必要はありませんので、引用@を使用することができます単語境界は、 "ABC"と "ABC"と "$ ABC"と一致することを意味します。 \\Wを使用するには、単語以外の文字が必要ですが、それはあなたが望むようには聞こえません。

私に何かが不足している場合は教えてください。

+0

+1。どうして私はいつも '\ b' ;-)を忘れてしまいます。 – Qtax

+0

申し訳ありませんが、私は質問ではっきりしていませんでした。私は\ w必要なものをカバーしたと思った。私は最初の答えの否定的なlookbehindが私に必要なものを私に与えると思います。私はそれが "$ ABC"と一致することを望んでいません。 – Robbie

+0

@Robbie、私の答えのlookbehind *はそれにマッチします。あなたはちょうど '^ [A-C] {3} $'をしたいですか? 'ABC'の前にどんな文字が許されていますか?空白だけを許したいなら、 '(?<!\ S)[A-C] {3}'を使うことができます。 – Qtax

-1

それはのように簡単です "[A-C] {3}" この

+0

です。これは、私が必要とする入力の始めにマッチを確実にするものではありません。 – Robbie

-1

OKあなたが

次試すことができますので、 "[A-C] [A-C] {2}"

関連する問題