2011-12-23 2 views
0

私は本当に問題のノブであるため、正規表現の作成には問題があります。A範囲のような式を検証するための正規表現

目的は、このような、ユーザ入力から '範囲' の式を検証することである。

  • 20-30(20と30の間)
  • 11,12(2及び4)
  • -10(10未満)
  • 80-(80より大きい)

等もの、任意の数の組み合わせ:

-10,11,12,20-30,80-

私はすでに()を呼び出すと.GetMatches()は、次の 正規表現を使用して、このような文字列とは別のコンポーネントを解析することができますよ。

var rangeRegex = new Regex(@"\d+(\.\d+)?-\d+(\.\d+)?"); 
var smallerThanRegex = new Regex(@"(?<![\d\.])-\d+(\.\d+)?"); 
var greaterThanRegex = new Regex(@"\d+(\.\d+)?-(?!\d)"); 

私は単なる文字列が有効な「レンジ式」であるかどうかを検証するために使用することができ、大きな正規表現にそれらを結合する方法についてはよく分かりません。

これを行う方法を知っている人はいますか?事前にどうもありがとうございました!

答えて

1

これは構文をチェックするための正規表現になりますが、文字列のセマンティクスについてのアイデアはありません!

^(?<=\D|^)(?:\d+(?:\.\d+)?-\d+(?:\.\d+)?|-\d+(?:\.\d+)?|\d+(?:\.\d+)?-|\d+(?:\.\d+)?)(?:,(?:\d+(?:\.\d+)?-\d+(?:\.\d+)?|-\d+(?:\.\d+)?|\d+(?:\.\d+)?-|\d+(?:\.\d+)?))*(?=\D|$)$ 

Guffaがよりよい解決策になる示唆したように、カンマでhere on Regexr

しかし、分割を、それを参照してください(1)!

+0

ありがとう、それは私が探しているものでした!私はあなたのソリューションとGuffaが提案したソリューションの両方を使用して、完全にフェールセーフにし、冗長部分(20-40,22のようなもの)を除外することを考えます。 – jkokorian

2

まず、コンマで区切り、各項目を検証して解析する必要があると思います。とにかく数字が意味を成すことを検証できる正規表現を書く方法はありません。

例えば、値が重複している範囲で、1,2,1,1,2または10-20,11-12,14-16のような入力を考えてみましょう。重複する範囲を許可してマージするかどうか、範囲が正しい順序に来るかどうかなど、一貫性のないデータをどうするかを決める必要があります。

+0

ありがとうございました。私はそれを行います。 – jkokorian

関連する問題