2012-03-05 98 views
0

我正在用C#開發Windows應用程序。我一直在尋找解決方案來解決我創建正則表達式模式的問題。我想創建一個正則表達式模式匹配的下列任一字符串:創建正則表達式模式所需的解決方案

XD=(111111) XT=( 588.466)m3 YT=(  .246)m3 G=(3.6)V N=(X0000000000) M=(Y0000000000) O=(Z0000000000) Date=(06.01.01)Time=(00:54:55) Q=(  .00)m3/hr 

XD=(111 ) XT=( 588.466)m3 YT=(  .009)m3 G=(3.6)V N=(X0000000000) M=(Y0000000000) O=(Z0000000000) Date=(06.01.01)Time=(00:54:55) Q=(  .00)m3/hr 

的具體要求是,我需要從上面給出的字符串是鍵/值對的集合所有的值。此外,想知道正確的方法(在效率和性能方面)兩個...正則表達式模式匹配或子字符串,針對上述問題。

如果需要更多的細節,請提前謝謝大家,讓我知道。

+0

單位是否還需要匹配單元('立方米/ hr'等)? – 2012-03-05 09:04:20

+0

是的,我確實需要匹配字符串中的單位。 – Shant 2012-03-05 09:16:16

+0

好的,我已經更新了我的答案。 – 2012-03-05 09:25:19

回答

0

我不知道C#,所以可能有更好的方法來構建一個鍵/值數組。我構建了一個正則表達式,並把它遞給RegexBuddy其產生下面的代碼片段:

StringCollection keyList = new StringCollection(); 
StringCollection valueList = new StringCollection(); 
StringCollection unitList = new StringCollection(); 
try { 
    Regex regexObj = new Regex(
     @"(?<key>\b\w+)  # Match an alphanumeric identifier 
     \s*=\s*    # Match a = (optionally surrounded by whitespace) 
     \(     # Match a (
     \s*     # Match optional whitespace 
     (?<value>[^()]+)  # Match the value string (anything except parens) 
     \)     # Match a) 
     (?<unit>[^\s=]+  # Match an optional unit (anything except = or space) 
     \b     # which must end at a word boundary 
     (?!\s*=)    # and not be an identifier (i. e. followed by =) 
     )?     # and is optional, as mentioned.", 
     RegexOptions.IgnorePatternWhitespace); 

    Match matchResult = regexObj.Match(subjectString); 
    while (matchResult.Success) { 
     keyList.Add(matchResult.Groups["key"].Value); 
     valueList.Add(matchResult.Groups["value"].Value); 
     unitList.Add(matchResult.Groups["unit"].Value); 
     matchResult = matchResult.NextMatch(); 
    } 
+0

親愛的Tim, 非常感謝。您的解決方案適用於源字符串中所有值的組合。感謝您的幫助和努力。 – Shant 2012-03-06 12:45:51

0
Regex re=new Regex(@"(\w+)\=\(([\d\s\.]+)\)"); 
MatchCollection m=re.Matches(s); 
  • m[0].Groups將有{ XD=(111111), XD, 111111 }
  • m[1].Groups將有{ XT=( 588.466), XT, 588.466 }
0
String[] rows = { "XD=(111111) XT=( 588.466)m3 YT=(  .246)m3 G=(3.6)V N=(X0000000000) M=(Y0000000000) O=(Z0000000000) Date=(06.01.01)Time=(00:54:55)  Q=(  .00)m3/hr", 
    "XD=(111 ) XT=( 588.466)m3 YT=(  .009)m3 G=(3.6)V N=(X0000000000) M=(Y0000000000) O=(Z0000000000) Date=(06.01.01)Time=(00:54:55) Q=(  .00)m3/hr" }; 

foreach (String s in rows) { 

    MatchCollection Pair = Regex.Matches(s, @" 
     (\S+)   # Match all non-whitespace before the = and store it in group 1 
     =    # Match the = 
     (\([^)]+\S+) # Match the part in brackets and following non-whitespace after the = and store it in group 2 
     ", RegexOptions.IgnorePatternWhitespace); 
    foreach (Match item in Pair) { 
     Console.WriteLine(item.Groups[1] + " => " + item.Groups[2]); 
    } 
    Console.WriteLine(); 
} 
Console.ReadLine(); 

如果您想要提取的單位也n使用這個表達式

@"(\S+)=(\([^)]+(\S+)) 

我增加了一組周圍括號,然後你會發現在item.Groups[3]

+0

道歉,但我怎麼能分別提取單位,如m3,V,m3/hr,因爲我將所有提取的值存儲在數據庫和源字符串中的所有單位(在上面的情況4),有單獨的列, 分別。再次感謝您的幫助。 – Shant 2012-03-06 12:37:31

+0

@Shant我更新了我的解決方案。 – stema 2012-03-06 12:49:34