2017-08-02 42 views
1

對於RegEx我沒有什麼好處,所以不太瞭解我借用的代碼中發生了什麼。我想分割以下字符串:如何拆分空格,保留空格並且不會丟失等於

CHARM CARD_SLOT=1 IO_SUBSYSTEM="CHARMS" CONTROLLER="CIOC-CB3-IO" DEFINITION="CHMIO_DO_24_VDC_HIGH-SIDE_CHARM" 

所以這是個別字符串,如:(我想回到什麼)

CHARM CARD_SLOT=1 
IO_SUBSYSTEM="CHARMS" 
CONTROLLER="CIOC-CB3-IO" 
DEFINITION="CHMIO_DO_24_VDC_HIGH-SIDE_CHARM" 

我使用這個代碼:

while (null != (workString = s.ReadLine())) 
{           
    RegexOptions options = RegexOptions.None; 
    Regex regex = new Regex(@"((""((?<token>.*?)(?<!\\)"")|(?<token>[\w]+))(\s)*)", options);           
    var result = (from Match m in regex.Matches(workString) 
    where m.Groups["token"].Success 
    select m.Groups["token"].Value).ToList(); 
    foreach (string o in result) 
    { 
     if (!o.Contains("{") || !o.Contains("}")) 
     { 
      endResult = endResult + "\r\n" + o; 
      Console.WriteLine("'{0}'", "\r\n" + o); 
     } 
    }           
} 

我目前正在返回的內容

CHARM 
CARD_SLOT 
1 
IO_SUBSYSTEM 
CHARMS 
CONTROLLER 
CIOC-CB3-IO 
DEFINITION 
CHMIO_DO_24_VDC_HIGH-SIDE_CHARM 
+0

嘗試'Regex.Matches(s,@「([^ =] +)=(\ S +)」)。Cast ().Select(m => new [] {m​​.Groups [1] .Value ,m.Groups [2] .Value})',參見http://ideone.com/yVIOCp。或者甚至可以用['([^ = \ s] [^ =] *)=(\ S +)'](http://ideone.com/f98s8P)正則表達式來嘗試。 –

+0

如果你想在一行中使用'CHARM CARD_SLOT = 1',那麼你不會在所有空間上分裂。 – Flater

回答

1

這符合你的例子:

var pattern = @"(\w[\w ]+=(?:""[^""]+""|[^ ]+))+"; 

var optionsList = Regex.Matches(src, pattern).Cast<Match>().Select(m => m.Value).ToList(); 
+0

你和AmoT都能工作,但AmoT的模式截斷了多於一個單詞的引號內的任何內容。你的工作是完美的,所以我會標記你糾正。謝謝 –

0

這種模式應該工作:

pattern = @"[^=]+=[^=]+(\s|.$)"; //matches with spaces 
    pattern = @"[^=\s]+=[^=]+(?=(\s|.$))"; //matches without spaces 

我的想法是採取=和 「東張西望」 雙方(尤其是右側)。 在兩種模式中,我看它是以「」結尾還是以字符串結束。最後,我通過使用lookahead功能刪除了匹配的空格,因爲我們不需要它們。