2011-07-27 65 views
0

我有一個輸入字符串:幫助與正則表達式C#

access_token=f34b46f0f109d423sd4236af12d1bce7f10df108ec2183046b8f94641ebe&expires_in=0&user_id=37917395 

的源代碼:

Regex regex = new Regex("access_token=([^&]+)"); 
    MatchCollection matches; 
    matches = regex.Matches(webBrowser1.SaveToString()); 
    if (matches.Count != 0 || access_token != string.Empty) { 
     webBrowser1.IsEnabled = false; 
     webBrowser1.IsHitTestVisible = false; 
     if (access_token == string.Empty) 
      access_token = matches[0].Value.Substring(13); 

我得到的訪問令牌,但我也有相匹配的USER_ID。我怎麼才能得到它?

請幫幫我,我不擅長這個。

+0

你需要匹配'user_id'也? –

+0

是的...... – SevenDays

+0

是不是順序重要? user_id可以先來嗎? –

回答

2
string input = @"access_token=f34b46f0f109d423sd4236af12d1bce7f10df108ec2183046b8f94641ebe&expires_in=0&user_id=37917395"; 


var result = Regex.Match(input, @"access_token=([^&]+).*?user_id=([^&]+)"); 

var access_token = result.Groups[1].Value; 
var user_id = result.Groups[2].Value; 
3

假設你的字符串在input這將設置變量accessToken和userId。如果不匹配,值將爲空。

Regex regex=new Regex("(?:access_token=(?<access>[^&]+))|(?:user_id=(?<userid>[^&]+))"); 
var accessToken=regex.Matches(input).OfType<Match>().Select(m=>m.Groups["access"]).Where(g=>g.Success).Select(g=>g.Value).FirstOrDefault(); 
var userId=regex.Matches(input).OfType<Match>().Select(m=>m.Groups["user_id"]).Where(g=>g.Success).Select(g=>g.Value).FirstOrDefault(); 

我通常定義,以減少打字對我

public static string GetGroup(this MatchCollection matches,string group name) { 
    return matches.OfType<Match>().Select(m=>m.Groups[name]).Where(g=>g.Success).Select(g=>g.Value).FirstOrDefault(); 
} 

的擴展方法,這讓我做的事情:

var matches=regex.Matches(input); 
var accessToken=matches.GetGroup("access"); 
var userId=matches.GetGroup("user_id"); 
+0

對不起,但這不適合我。 – SevenDays

+0

你能更具體地說明它是如何不起作用的,我已經用linqpad和你提供的字符串測試過了,它工作正常嗎? –

+0

我猜你沒有對System.Linq的引用,所以OfType和Select擴展方法失敗 –