2017-01-13 161 views
0

我有以下問題:用於匹配正則表達式的表達式範圍

  • 字符串是通過正則表達式進行驗證。
  • 該字符串包含用分號分隔的範圍或單個值,例如, 100-200;10;2300-3400;34;
  • 每個數字的最大值是99999
  • 字符串中不允許有字母。

我有什麼到現在:

^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])? ([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$? 

因此我正則表達式是由三個可選組類型:

  • 的起點:^([0-9]{1,5}[-][0-9]{1,5}[;])? ^([0-9]{1,5}[;])?
  • 中東:([0-9]{1,5}[-][0-9]{1,5}[;])?([0-9]{1,5}[;])?
  • 結束:([0-9]{1,5}[-][0-9]{1,5}[;])*$? ([0-9]{1,5}[;])*$?

這個正則表達式並沒有解決我的問題,雖然輸入表達式中的字母常常返回true,但應返回false。任何想法如何解決這個問題?

這是正則表達式的通過RB註釋以下的簡化版本:

  • 的起點:^(\d{1,5}\-\d{1,5};)? ^(\d{1,5};)?
  • 中東:(\d{1,5}\-\d{1,5};)? (\d{1,5};)?
  • 結束:(\d{1,5}\-\d{1,5};)*$? (\d{1,5};)*$?
+0

負的'-10-10'範圍和下降範圍'200-100'怎麼樣? – fubo

+0

負範圍是不允許的,降序的是 – Chris

+2

爲什麼不直接使用字符串拆分,先用分號分隔然後再用破折號。最後使用int.TryParse。 – jdweng

回答

1

這個怎麼樣提取組別:

\b(?<FirstNum>[1-9][0-9]{1,4})(-(?<SecondNum>[1-9][0-9]{1,4}))?; 

Permalink to RegexStorm包括兩個無效的測試用例1234-12345678912345

然後以檢查其中是否包含任何字母只需使用下面的表達式:

[A-Za-z] 

,並驗證它:

Regex regex = new Regex("[A-Za-z]"); 
if (regex.IsMatch(inputString)) 
{ 
    //Invalid string 
} 

雖然正則表達式,這是有用的,如果你確實需要使用後面的範圍,最好使用string.Splitint.TryParse的組合:

string input = "100-200;10;2300-3400;34;"; 

string[] ranges = input.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); 
foreach (string range in ranges) 
{ 
    string[] numbers = range.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries); 
    foreach (string number in numbers) 
    { 
     int parsedNumber; 
     if (!Int32.TryParse(number, out parsedNumber)) 
     { 
      //Invalid input 
      break; //Or return false... 
     } 

     //Use parsedNumber here 
    } 
} 
+0

正則表達式將允許輸入諸如'1234-'和'1234512345'。此外,它確實允許領先(或全部)零,儘管原來的也是如此,所以只是指出了 – pinkfloydx33

+0

@ pinkfloydx33良好的捕獲我已經更新,所以它現在應該工作 – TheLethalCoder

+1

@ pinkfloydx33我現在已經添加了固定鏈接現在也用於測試,修復了另一個問題,因此它在匹配開始時檢查字邊界 – TheLethalCoder