2016-02-24 55 views
1

我想解析給定的字符串,這是一種用/分隔的路徑。我需要編寫正則表達式,將路徑中的每個段匹配到相應的正則表達式組。與可選匹配組的正則表達式

實施例1:

輸入:

/EAN/SomeBrand/appliances/refrigerators/RF444

輸出:

Group: producer, Value: SomeBrand Group: category, Value: appliances Group: subcategory, Value: refrigerators Group: product, Value: RF4441

實施例2:

輸入:

/EAN/SomeBrand/appliances

輸出:

Group: producer, Value: SomeBrand Group: category, Value: appliances Group: subcategory, Value: Group: product, Value:

我嘗試下面的代碼,它工作正常時,路徑是滿的(像在第一〔實施例),但未能找到當輸入字符串不偏不倚時(如例2)。

static void Main() 
{ 
    var pattern = @"^" + @"/EAN" 
       + @"/" + @"(?<producer>.+)" 
       + @"/" + @"(?<category>.+)" 
       + @"/" + @"(?<subcategory>.+)" 
       + @"/" + @"(?<product>.+)?" 
       + @"$"; 

    var rgx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); 
    var result = rgx.Match(@"/EAN/SomeBrand/appliances/refrigerators/RF444"); 

    foreach (string groupName in rgx.GetGroupNames()) 
    { 
    Console.WriteLine(
     "Group: {0}, Value: {1}", 
     groupName, 
     result.Groups[groupName].Value); 
    } 


    Console.ReadLine(); 
} 

任何建議是值得歡迎的。不幸的是,我不能簡單地拆分字符串,因爲我使用的框架期望正則表達式對象。

+0

這是否意味着您的所有零件(包括'producer'和'category')都是可選的? –

回答

1

嘗試

var pattern = @"^" + @"/EAN" 
    + @"(?:/" + @"(?<producer>[^/]+))?" 
    + @"(?:/" + @"(?<category>[^/]+))?" 
    + @"(?:/" + @"(?<subcategory>[^/]+))?" 
    + @"(?:/" + @"(?<product>[^/]+))?"; 

注意我如何與[^/]取代.,因爲要使用/拆分字符串。請注意,即使每個子部分使用可選的量詞(?

2

您可以使用可選組(...)?與否定的字符類[^/]+更換.+貪婪點匹配模式:

^/EAN/(?<producer>[^/]+)/(?<category>[^/]+)(/(?<subcategory>[^/]+))?(/(?<product>[^/]+))?$ 
             ^     ^^^     ^^ 

regex demo

這就是你需要聲明你的正則表達式在C#代碼:

var pattern = @"^" + @"/EAN" 
      + @"/(?<producer>[^/]+)" 
      + @"/(?<category>[^/]+)" 
      + @"(/(?<subcategory>[^/]+))?" 
      + @"(/(?<product>[^/]+))?" 
      + @"$"; 

var rgx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); 

注意我正在使用常規捕獲組作爲可選項,但RegexOptions.ExplicitCapture標誌將所有非命名捕獲組轉換爲未捕獲,因此它們不出現在Match.Groups之間。因此,我們始終只有5個組,甚至沒有使用非捕獲可選組(?:...)?