2017-08-10 31 views
1

在繼續之前,我需要確保一個字段在C#中使用正則表達式使用正確的語法。這裏是我的代碼:C#的模式正則表達式語法

Description = 'AB1234567,AB3456789;AB2345678'; 

Regex reg = new Regex("(AB.{7},?)*;?(AB.{7},?)*"); 
Match match = reg.Match(Description); 
if (!match.Success) 
{ 
    //code to raise error 
} 

所以,一些語法規則:

  • 領域有2個英文字母(在這種情況下AB),其次是7個字符元素。
  • 這些元素用逗號分隔,在「;」的左側或右側。他們在哪一方表明他們的財產,但任何一方都可能是空的。
  • 如果右側不是空的,那麼「;」是強制性的,如果它是可選的。
  • 每邊的最後一個元素不能以「,」結尾。

正確的示例:

- AB1234567,AB3456789;AB2345678 
- AB1234567,AB3456789; 
- AB1234567 
- ;AB2345678,AB34567890 

錯誤示例:

- AB1234567,;AB2345678 
- AB3456789;AB2345678, 

我的正則表達式是不完整的,但我不能想出如何考慮所有情況。這個問題的正確表達式是什麼?

+0

什麼是最終目標?你是否需要在列表中提取AB ***? – codeSetter

+1

是的,分成兩個列表。 – user7792598

+0

好的,這裏的正則表達式應該可以工作(? AB \ d {7} [,;]),你會收到匹配的命名組。轉到:https://regex101.com/把yuor正則表達式和測試數據....你會做得很好.. – codeSetter

回答

-1

我認爲你的表達幾乎是正確的,你只需要確保一個逗號後面跟着另一個AB組。你可以這樣做與positive lookahead,像這樣:

^(AB.{7}(,(?=AB))?)*;?(AB.{7}(,(?=AB))?)*$ 

你也需要把在開始和結束標記,否則你會得到多個子匹配。

這個表達式將不;AB2345678,AB34567890樣品,因爲它在最後一組8位,而不是7

編輯匹配:如果你想在一個好的收集的AB組,嘗試

^((?<left>AB.{7})(,(?=AB))?)*;?((?<right>AB.{7})(,(?=AB))?)*$ 

然後match.Groups["left"]?.Capturesmatch.Groups["right"]?.Captures會給你各自匹配的字符串(或null)。這被稱爲命名捕獲。

+0

Downvoters謹慎解釋?給定的表達式適用於所有樣本(除了我提到的不符合描述的那個)。你可以在這裏查看:http://regexstorm.net/tester – TToni

0

直接的答案和更簡化的版本,應該在所有選項中工作。

bool IsValid(string line) 
    { 
     if (string.IsNullOrEmpty(line)) return true; 
     return !line.Trim().EndsWith(","); 
    } 

IEnumerable<string> GetTokens(string line) 
    { 
     var pattern = @"(AB\d{7}([,;]|[^0-9a-zA-Z]|$))"; 
     var matches = Regex.Matches(line, pattern, RegexOptions.Singleline); 

     foreach (Match match in matches) 
     { 
      yield return match.Value; 
     } 
    } 

string inputLine = ";AB2345678,AB34567890"; 

    string[] leftRight = inputLine.Split(new[] { ';' }); 
    string left =string.Empty, right = string.Empty; 

    if (leftRight.Length > 0) left = leftRight[0]; 
    if (leftRight.Length > 1) right = leftRight[1]; 

    bool isLeftValid = IsValid(left); 
    bool isRightValid = IsValid(right); 

    IEnumerable<string> leftTokens = null, rightTokens = null; 

    if (isLeftValid) leftTokens = GetTokens(left); 
    if (isRightValid) rightTokens = GetTokens(right);