2010-03-23 89 views
0

我試圖將以下字符串分組爲三個組。正則表達式匹配不能正常工作

0:0:Awesome:awesome 

這是 「」, 「」 和 「真棒:真棒

使用正則表達式:

^([0-9]+)\:([0-9]*)\:(.*)$ 

它可以在網上正則表達式罰款服務:http://rubular.com/r/QePxt57EwU

但似乎.NET不同意。 Picture of Regex problem from Visual Studio http://xs.to/image-3F8A_4BA916BD.jpg

+1

Rubular使用Ruby的regexp引擎,它與.NET的不一樣。對於這種模式,我沒有看到它不應該起作用的任何理由,但只是要記住。 – 2010-03-23 21:01:44

+0

添加到丹尼爾說,一個偉大的測試.NET正則表達式的工具是Expresso,雖然測試你的工作似乎對我很好。 http://www.ultrapico.com/Expresso.htm – FrustratedWithFormsDesigner 2010-03-23 21:03:34

回答

5

MatchCollection包含迭代地將正則表達式應用於源字符串的結果。在你的情況下,只有1個匹配 - 所以結果是正確的。你可以在比賽中獲得多次獲勝。這是你想比較的 - 而不是比賽的數量。

MatchCollection matches = RegEx.Matches("0:0:Awesome:awesome", 
             "^([0-9]+)\:([0-9]*)\:(.*)$"); 

if(matches.Count != 1 && matches[0].Captures.Count != 3) 
    //... 
+0

我非常感謝你!愚蠢的錯誤。 – 2010-03-23 21:18:37

0

我覺得這個正則表達式會適合

 
(?<nums>\d+\:?)+(?<rest>.*) 

然後你就可以得到「民」和「休息」的分組在一起,如圖

 
public Regex MyRegex = new Regex(
     "^(?<nums>\\d+\\:?)+(?<rest>.*)$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 
MatchCollection ms = MyRegex.Matches(InputText); 

InputText將包含樣品'0:0:Awesome:Awesome'

1

當你想訪問匹配的組ing可以幫助你

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var pattern = "^([0-9]+)\\:([0-9]*)\\:(.*)$"; 

      var matches = Regex.Match("0:0:Awesome:awesome", pattern); 

      foreach (var match in matches.Groups) 
       Console.WriteLine(match); 
     } 
    } 
}