2013-12-09 94 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