2017-08-29 59 views
0

我並不陌生正則表達式的概念,但有時候,所有事情的語法和語義都會讓我困惑。我一直在試圖建立一種模式來識別使用單詞和小數點之間的空格組合

Ambient Relative Humidity: 31.59 

隨着分組

Ambient Relative Humidity (Group 1) 

31.59 (Group 2) 

但我也需要能夠匹配的東西,如

Operator: Bob 

隨着分組

Operator (Group 1) 

Bob (Group 2) 

Sensor Number: 0001 

隨着分組

Sensor Number (Group 1) 

0001 (Group 2) 

這裏是我所創建的當前的模式,其適用於涉及操作者和傳感器數目的實施例,但不與所述第一實施例相匹配(環境溼度)

\s*([A-Za-z0-9]*\s*?[A-Za-z0-9]*)\s*:\s*([A-Za-z0-9]*) 

回答

2

你必須添加更多的空間分隔的關鍵部分的正則表達式。
另外,您必須爲值中的十進制數字添加一個選項。

像這樣的事情([A-Za-z0-9]*(?:\s*[A-Za-z0-9]+)*)\s*:\s*((?:\d+(?:\.\d*)?|\.\d+)|[A-Za-z0-9]+)?

https://regex101.com/r/fl0wtb/1

解釋

(       # (1 start), Key 
     [A-Za-z0-9]* 
     (?: \s* [A-Za-z0-9]+)* 
)        # (1 end) 
\s* : \s* 
(       # (2 start), Value 
     (?:       # Decimal number 
      \d+ 
      (?: \. \d*)? 
     | \. \d+ 
    ) 
    |        # or, 
     [A-Za-z0-9]+     # Alpha num's 
)?       # (2 end) 
1

我可能已經過時沒有想到,現在我有以下表達式

\s*([A-Za-z0-9]*\s*[A-Za-z0-9]*\s*[A-Za-z0-9]*)\s*:\s*([A-Za-z0-9.]*) 

唯一的是,它包括有時候我試圖避免的空間,但我可以稍後修剪它們。很抱歉張貼這麼快!

0
var st = "Ambient Relative Humidity: 31.59 Operator: Bob Sensor Number: 0001"; 
var li = Regex.Matches(st, @"([\w]+?:)\s+(\d+\.?\d+|\w+)").Cast<Match>().ToList(); 

    foreach (var t in li) 
    { 
     Console.WriteLine($"Group 1 {t.Groups[1]}"); 
     Console.WriteLine($"Group 2 {t.Groups[2]}"); 
    } 

    //Group 1 Humidity: 
    //Group 2 31.59 
    //Group 1 Operator: 
    //Group 2 Bob 
    //Group 1 Number: 
    //Group 2 0001 
相關問題