2011-09-01 17 views
4

鑑於表達^(?<res>a).*(?<res>c)和測試字符串abc,預期命名組res到Concat的都發現價值並獲得ac,但得到的最新變化 - c正則表達式在.NET:加盟重複命名的捕獲組

C#的正則表達式類的任何方式來支持正則表達式中的命名組的concat?

相關的問題是Regex issue with named captured pairs,並有機會,它說是Perl/PCRE不支持重複的命名對,但在這裏我得到了.NET,並尋找它的特殊魔法使的正則表達式返回一個包含比賽都從字符串的不同部分找到值(也就是說,abbbbbcdef應該返回ac)。

不止一次地調用正則表達式或者在代碼中加入結果組並不是一個良好的容錯解決方案 - 正在尋找在正則表達式中完成整個工作。

回答

-1

目前的解決辦法是按升序分配組名稱爲每個條件:((?<group0>))|((?<group1>)(?<group0>))

匹配,找到的所有組都會列出,並通過他們的名字排序,無論從group0,group1或只是group0建立一個最終的查詢字符串後(取決於匹配的條件)。

另一個技巧是開始從開始匹配的需要:

^(?wastebytes(condition)(chance1)|(chance2))

3
var match = re.Match(s); 
var captures = match.Groups["res"].Captures.Cast<Capture>().Select(c => c.Value); 
var result = string.Concat(captures); 

Cast()是必要的,因爲集合Captures收益沒有實現IEnumerable<T>

4

非唯一組名稱的目的僅僅是爲了提供捕獲字符串部分的更多靈活性。以捕獲的零件和不同的重組它們是你正則表達式後做事情已經匹配 - 通常與Replace方法:

string s0 = @"abbbbbcdef"; 
string s1 = Regex.Replace(s0, @"^.*(a).*(c).*$", "$1$2"); 
Console.WriteLine(s1); 

輸出:

ac 

這個問題,讓我想起了別人的我已經看到人們希望正則表達式「跳過」他們不感興趣的字符串部分 - 也就是說,要消耗一些部分而不是其他部分。在我熟悉的任何正則表達式風格中,沒有辦法做到這一點。

相關問題