2016-09-23 4 views
0

次の正規表現は、私が思った通りに動作しません。正規表現グループオプション

("^\\d{2}(?:\\d{2})?\\.\\d{2}(\\.\\d{2-4})?$"); 

私は2桁の数字が続くピリオドに続く2桁または4桁のどちらかで始まる文字列を、一致して、別の期間をオプションと2つのまたは4のいずれかの数字しようとしています。

私は33.44.4444が動作すると思いますが、33.33と同じように動作しますが、2番目の期間を持つ文字列があるときはいつも、式が失敗します。

私は間違っていますか?

+0

まず最初に:しかし、また、あなただけの私は、この正規表現を使用する2または4(いない3)したい場合は、その後、あなたはすべてのそれらの二倍のバックスラッシュを捨てることができますC#での正規表現のための逐語的文字列リテラルを使用して:)これを[mcve]として書き直せますか?それは簡単です - 正規表現を作成し、あなたが動作すると期待していた一致を示すコンソールアプリケーションです。誰でもそれを行うことができますが、* 1人だけが入力を行う必要があり、他の人がコピーして貼り付けることができれば役に立ちます。 –

答えて

0

あなたは、この正規表現を使用することができます。

^\d{2}(?:\d{2})?\.\d{2}(?:\.\d{2}(?:\d{2})?)?$ 

\d{2-4}は文字通り{2-4}テキストと一致します。

RegEx Demo

0

あなたは、式の最初のセクションでは、「2つまたは4桁の数字を」表現方法が正しい:

\\d{2}(?:\\d{2})? 

2番目の部分は間違ってそれをしない:

(\\.\\d{2-4})? 

最初の部分を2番目の部分にコピーして問題を解決します。

("^\\d{2}(?:\\d{2})?\\.\\d{2}(\\.\\d{2}(?:\\d{2})?)?$"); 

Demo.

1

あなたの正規表現は、あなたが{2,4}を使用している場合、それはあなたがしているキャプチャ2〜4文字のために行くだろう、あなたは{2-4}の部分を除いてやりたいことのために正しいです探している。

("^\\d{2}(?:\\d{2})?\\.\\d{2}(\\.\\d{2,4})?$"); 

希望します。

+0

'\\ d {2,4}'は3桁の数字も受け入れます。 OPは、2つか4つを受け入れることを望んでいるようですが、3つではありません。 – dasblinkenlight

1

他の人が{2-4}の構文が間違っていると指摘しています。 {2,4}を使用して、発生の範囲を指定します。注意することは

@"^(\d{2}|\d{4})\.\d{2}(\.(\d{2}|\d{4}))?$"