2016-05-13 4 views
2

昇順順序付け正規表現は、私は、次の条件を持つユーザ入力(asp.net、C#)を検証する正規表現を書き込もうとしてい

- 1,2,3,4,5,6 - valid 
- 2,5,6   - valid 
- 4    - valid 
- 2,5,6,  - invalid 
- 3,6,5   - invalid 
- 2,2,5,6  - invalid 

は、これまで私が持っている:

^((1,)?(2,)?(3,)?(4,)?(5,)?(6)?)$ 

これで問題は数字1-5は、彼らがある場合は、カンマが続いする必要があります数字だけが入力されていますが、正しくありません。

+3

。これのための正規表現は、あまりにも長く読むことができません。 –

+1

@WiktorStribiżew。応答していただきありがとうございます。私はちょうどC#のコードでチェックを実行することをお勧めですか?また、正規表現を使用するかどうかが最も効率的なオプションかどうか私は今でもそれが正規表現では、それが単なる学習目的のために行われる方法が好きです。 – Ant20

+1

いいえ、私は誰も使用しようとしていないパターンに約40分を費やすつもりはありません。要するに、あなたが持っている各桁を取得し、次に条件付き構成を使用して一致するものを見る必要があるということです。または、すべての選択肢を列挙するブルートフォースアプローチ。正規表現はそのようなタスクのためのものではありません –

答えて

2

\bを使用して、単語の境界にあることを確認し、,*にコンマまたはカンマを付けることができます。これは、作業中に結果 - かなり長い

^((1)?(\b,?2)?(\b,?3)?(\b,?4)?(\b,?5)?(\b,?6)?)$ 
+1

ニースは、 '2'、 '、5,6'を避けるために '*'を '?'に変更してください。 (\ b、?3)?(\ b、?4)?(\ b、?5)?(\ b、?6)?)$ ' – ClasG

+0

@ClasG私の間違い、間違った記号を使った! :) –

+1

それは素晴らしいです、ありがとう!私はまだ正規表現を学習する初期段階にあり、前に\ bシンボルを出現させていないので、もう少し詳しく見ていきます。もう一度ありがとう:) – Ant20

0

(これは愚かな答えです)

はいえそこに6つの値があり、それぞれが存在存在かどうかのいずれかであることを考えると、2^6 = 64可能な正しい値があります;数字がない可能性をすべて排除したいと思っていることを除いて、63の可能な正しい値しかありません。この正規表現は、それらを許可します:

^(6|5|5,6|4|4,6|4,5|4,5,6|3|3,6|3,5|3,5,6|3,4|3,4,6|3,4,5|3,4,5,6|2|2,6|2,5|2,5,6|2,4|2,4,6|2,4,5|2,4,5,6|2,3|2,3,6|2,3,5|2,3,5,6|2,3,4|2,3,4,6|2,3,4,5|2,3,4,5,6|1|1,6|1,5|1,5,6|1,4|1,4,6|1,4,5|1,4,5,6|1,3|1,3,6|1,3,5|1,3,5,6|1,3,4|1,3,4,6|1,3,4,5|1,3,4,5,6|1,2|1,2,6|1,2,5|1,2,5,6|1,2,4|1,2,4,6|1,2,4,5|1,2,4,5,6|1,2,3|1,2,3,6|1,2,3,5|1,2,3,5,6|1,2,3,4|1,2,3,4,6|1,2,3,4,5|1,2,3,4,5,6)$ 

実際には使用しないでください。私たちはどちらも悪く見えるようにします。

0

正規表現ではありません。簡単で正確な

string str = ",1, 2,3, 4, 5, 6"; 
bool valid = false; 
var invalidString = str.Split(',').Any(p => 
{ 
    int num = 0; 
    return int.TryParse(p, out num); 
}); 
if (!invalidString) 
{ 
    List<int> list = str.Split(',').Select(p => int.Parse(p)).ToList(); 
    var sorted = list.SequenceEqual(list.OrderBy(p => p)); 
    var hasDuplicates = list.Count != list.Distinct().Count(); 
    valid = sorted && !hasDuplicates; 
} 
0

厳密には、学習の目的で、問題を細分化してください。

数字の後に0個以上のコンマと数字を続けて構成する必要があります。

^\d(?:,\d)*$ 

わずか6桁で、昇順にする必要があります。ですから、それらとその介入するカンマをリストしてください。それぞれオプションです。

^1?,?2?,?3?,?4?,?5?,?6?$ 

上記の正規表現の両方が同時に一致しなければならないという難点があります。そのうちの1つにゼロ幅のルックアヘッドを使用することができます。これは試合を行いますが、どのキャラクターも「消費する」ことはありません。したがって、それが一致した後、正規表現の次の部分は、ルックアヘッドと同じ場所で開始されます。先読みは、(?=と ')'に式をラップすることによって実現されます。寄付:2つの正規表現を組み合わせる

(?=^\d(?:,\d)*$) 

は以下与える:簡単に正規表現なしで行うことができる

(?=^\d(?:,\d)*$)^1?,?2?,?3?,?4?,?5?,?6?$ 
+0

あなたの最初の投稿の後にどのように前向きな外観が働いたのかは分かりませんでしたが、あなたのアップデートによってははるかに明確になりました - ありがとう! – Ant20

関連する問題