2014-04-18 188 views
2

我很難搞清楚如何提出這個問題,這可能是我爲什麼還沒有找到解決方案。希望這個解釋能讓我走上正軌。賽後的多場比賽

我有一個單詞(強,弱,中等),後跟一個或多個字母/數字組合的字符串。例如:

Weak: B44,45; C5 

Moderate: DR1201,13,14,17,18; DP+; B44 

我有興趣只捕獲單詞和字母。所以對於第一行我想要得到「弱」,「B」,「C」,

第二行將是「中等」,「DR」,「DP」,「B」

下面簡單的regex:

\b(A|B|C|DP|DQ|DR) 

捕獲的字母部分完美,但是當我在前面加上的話:

(Strong|Weak|Moderate).*(A|B|C|DP|DQ|DR) 

只有在每行的最後一個字母被捕獲。我意識到這是正則表達式的貪婪本質。使它成爲一個懶惰的匹配捕獲每一行的第一個字母。但有沒有什麼辦法讓它捕捉到每一行上的字母和全部?我不禁想到我錯過了一些東西,只是無法弄清楚。

+0

好的。第二行應該只包含「B」而沒有其編號。編輯。 –

回答

4

你可以使用這樣的事情:

(Strong|Weak|Moderate)(?:.*?\b(A|B|C|DP|DQ|DR))+ 

,第一組將包括StrongWeak,或Moderate。第二組將包含多個捕獲,每個字母找到一個。這裏的非貪婪量詞需要確保它不會吞下第一組和第二組之間的任何其他字符。例如:

var input = @" 
Weak: B44,45; C5 
Moderate: DR1201,13,14,17,18; DP+; B44"; 
var pattern = @"(Strong|Weak|Moderate)(?:.*?\b(A|B|C|DP|DQ|DR))+"; 
var matches = Regex.Matches(input, pattern); 
foreach(Match m in matches) { 
    Console.Write("{0}: ", m.Groups[1].Value); 
    foreach(Capture c in m.Groups[2].Captures) { 
     Console.Write("{0}, ", c.Value); 
    } 

    Console.WriteLine(); 
} 

將產生以下的輸出:

Weak: B, C, 
Moderate: DR, DP, B, 
+0

這看起來非常像我希望的。非常感謝! –

0

你可以匹配所有的字母:

\b[A-Za-z]+ 

你應該得到所有的字母組成的數組。

\b確保在它之前沒有其他字母或數字(或下劃線,因爲它是\w類的一部分)。

regex101 demo

在代碼:

string input = @" 
Weak: B44,45; C5 

Moderate: DR1201,13,14,17,18; DP+; B44 
"; 
string[] lines = input.Split(new Char [] {'\n'}); 
var reg = new Regex(@"\b[A-Z]+", RegexOptions.IgnoreCase); 

/// Using RegexOptions.IgnoreCase lets you use [A-Z]+ just the same way as 
/// [A-Za-z]+ 

foreach (String line in lines) 
{ 
    if (line == "") 
    { 
     continue; 
    } 
    var words = reg.Matches(line) 
        .OfType<Match>() 
        .Select(m => m.Value) 
        .ToList(); 
    Console.WriteLine(string.Join(", ", words.ToArray())); 
} 

輸出:

Weak, B, C 
Moderate, DR, DP, B 

demo on ideone

-2

問題是不明確......但是這可能會有幫助:

\b[a-zA-z]+\.[a-zA-z]+ 
+1

請爲您的答案添加一些解釋,以及它如何回答問題。 *特別是*如果您發現問題不清楚,請務必解釋您的代碼是否有意完成。 (僅供參考,我作爲低質量崗位評論遇到此問題。) –