2013-12-09 153 views
0

我有以下格式一些文本輸入:複雜的正則表達式的正則表達式

[PARENT] - [選項] - [選項]

例如

  1. BIKE -XT-MM-LX-100-BB
  2. TRICYCLE -MM-XP
  3. MOTORBIKE -X100V (-X100V是不是一個不錯的選擇)

我使用正則表達式分離選項。 由於某些例外情況,將選項分開並不像您看到的那麼容易。 除了以X開頭並且長於兩位數的任何東西,例如#3(其中-X100V不是選項)之外,任何後面跟短劃線的選項都應該是一個選項。 後來我與表達等,這些去分開大塊:

// Only separates 2 digit options, but we have more digit options: 
(\A[^-]+)(-\w\w\b)+ 

// 2 digits and more option which -X100V fits into also. but not an option:  
(\A[^-]+)(-\w{2,}\b)+ 

// which separates any 2 digit and longer followed by dash as an option 
// unless it is started with X (which rules out my 2 digit -XX options by mistake): 
(\A[^-]+)(-[^\BX]\w{1,}\b)+ 

現在我只需要一個步驟,以增加一條規則,只有消除了開始與-X的情況,但都超過兩位數,那麼我可以再次包含像-XT這樣的示例。

我很想聽聽這些建議。

回答

0

我不明白這裏需要正則表達式。只需使用String.Split並在連字符上分開。如果您需要的話,您可以重新組合第一個,如果它不是「選項」並且應該是「家長」的一部分。

喜歡的東西:

var inputString = /*your input string, e.g. "BIKE-XT-MM-LX-100-BB"*/; 
var parts = inputString.Split('-'); 

var parent = parts.First(); 
var options = parts.Skip(1).ToList(); 

//put back any non-"option"s 
while(options.Any() && options.First().StartsWith("X") && 
    options.First().Length > 3) 
{ 
    parent = String.Format("{0}-{1}", parent, options.First()); 
    options.RemoveAt(0); 
} 
+0

@Ic。真的很感謝你的回答。我其實也是這樣做的。然而,正則表達式是一種強大的工具,可以將相同的結果寫入一段非常短且相當可讀的代碼行,我主要想學習如何完成這種類型的轉換。 – Mehrad

0

如果你能證明一個完整的文本輸入將是有益的。

基於到目前爲止,你已經證明我們什麼,父從選項中分離正則表達式是簡單的:在字符串\A年初

\A\w+(?=-)

  1. 斷言位置。您也可以使用^

  2. 匹配單個字符即「單詞字符」(字母,數字等))\w+

  3. 之間一個和無限次,多次可能的,如需要(貪婪)回饋+

  4. 斷言以下正則表達式可以被匹配,開始在該位置(正超前)(?=-)

  5. 匹配字符「 - 」的字面-

0

地使用這種正則表達式分裂圖案-(?!X[^-\r\n]{2})Demo