2017-04-20 39 views
0

我想要分割它具有以下圖案的文本行:正則表達式splting通過使用不同的分隔符

Name : Type := start_value ; // comment 

start_valuecomment是可選的,分號是強制性的。這是一個幾行的例子:

MinF : DINT ; //Minimum frequentie: 0 = 0,0 Hz 
MaxF : DINT := L#100000; //Maximum reference:75000 = 75,0Hz 
RampUp : DINT := L#50; //Ramp up tijd: 100 = 1,00 seconde 
RampDown : DINT := L#50; //Ramp down tijd: 100 = 1,00 seconde 
V1 : DINT ; //Snelheid 1: 50,00% 

我可以用只使用一個正則表達式嗎?

回答

1

我suggset 匹配而不是分裂。隨着pattern幫助像

string pattern = 
    @"^\s*(?<Name>[A-Za-z0-9]+)\s*:\s*(?<Type>[A-Za-z0-9]+)(\s*:=\s*(?<Value>\S*))?\s*;\s*(//(?<Comment>.*))?$";    

,我們可以簡單地分析,線

string[] source = new string[] { 
    "MinF : DINT ; //Minimum frequentie: 0 = 0,0 Hz", 
    "MaxF : DINT := L#100000; //Maximum reference:75000 = 75,0Hz", 
    "RampUp : DINT := L#50; //Ramp up tijd: 100 = 1,00 seconde", 
    "RampDown : DINT := L#50; //Ramp down tijd: 100 = 1,00 seconde", 
    "V1 : DINT ; //Snelheid 1: 50,00%", 
}; 

var result = source 
    .Select(line => Regex.Match(line, pattern)) 
    .Where(match => match.Success) 
    .Select(match => new { 
    name = match.Groups["Name"].Value, 
    type = match.Groups["Type"].Value, 
    value = match.Groups["Value"].Value, 
    comment = match.Groups["Comment"].Value, }) 
    .ToArray(); 

測試

Console.Write(string.Join(Environment.NewLine, result 
    .Select(item => $"{item.name,-8} {item.type,4} {item.value,-8} {item.comment}"))); 

結果:

MinF  DINT   Minimum frequentie: 0 = 0,0 Hz 
MaxF  DINT L#100000 Maximum reference:75000 = 75,0Hz 
RampUp DINT L#50  Ramp up tijd: 100 = 1,00 seconde 
RampDown DINT L#50  Ramp down tijd: 100 = 1,00 seconde 
V1  DINT   Snelheid 1: 50,00% 
+0

謝謝你這個完美的作品。 –

+0

@Lech Wiecierzynski:不客氣! –