2017-09-22 73 views
0

我想在C#中創建一個簡單的正則表達式來將字符串拆分爲標記。我遇到的問題是,我使用的模式捕獲一個空字符串,這會拋出我期望的結果。我能做些什麼來改變我的正則表達式,所以它不會捕獲空字符串?C#正則表達式捕獲空字符串

var input = "ID=123&User=JohnDoe"; 
var pattern = "(?:id=)|(?:&user=)"; 
var tokens = Regex.Split(input, pattern, RegexOptions.IgnoreCase); 

// Expected Results 
// tokens[0] == "123" 
// tokens[1] == "JohnDoe" 

// Actual Results 
// tokens[0] == "" 
// tokens[1] == "123" 
// tokens[2] == "JohnDoe" 
+1

見[解析「查詢字符串」格式化數據的最簡單方法](https://stackoverflow.com/questions/11956948/easiest-way-to-parse-querystring-formatted-data)。 –

+0

鏈接不回答OP - 它依賴於.NET核心中不存在的System.Net.Http靜態方法 –

+1

@WiktorStribiżew肯定指向更好的方法。您的查詢字符串在語義上相同的輸入'「User = JohnDoe&ID = 123」'時會失敗,因爲您檢查了正則表達式中的&。最好不要在這一個上重新發明輪子。 –

回答

2

儘管針對您的OP使用不同方法的意見可能有好處,但它們並未解決您關於RegEx行爲的具體問題。

我認爲,雖然你得到的正則表達式行爲的原因必須與隱式捕獲組(ed:或者它可能只是限制第一組的捕獲行爲是足夠的),但我沒有使其達到了RegEx層次理解的頂層。

編輯:

工作正則表達式給定的測試用例:

(?>id=)|(?:&user=)

如果沒有,這是根據自己的喜好,你總是可以釘謂詞的標記列表:

tokens.Where(x => !string.IsNullOrWhiteSpace(x))

0

我不認爲你可以用Regex.Split來解決這個問題,以 說實話。一個強力的方式來做到這一點是要刪除所有""

var input = "ID=123&User=JohnDoe"; 
var pattern = "(?:id=)|(?:&user=)"; 
var tokens = Regex.Split(input, pattern, RegexOptions.IgnoreCase).Where(x => x != ""); 

我認爲你應該使用正則表達式,實際上捕獲組的標記。

var input = "ID=123&User=JohnDoe"; 
var pattern = "id=(.+)&user=(.+)"; 
var match = Regex.Match(input, pattern, RegexOptions 
    .IgnoreCase); 
match.Groups[1] // 123