2015-11-14 47 views
-3

考慮我有以下字符串:C#查找大字符串模式的所有子

jkasdlue as 12&sdaj__3982[source=saj_/29]sj*2&7^;'asj[source=-js/.2]_jsld+=[source=283] 

我想獲得下面的字符串數組的輸出:

{"saj_/29","-js/.2","283"} 

任何幫助將是讚賞。謝謝。

UPDATE

好。如果我的問題太寬泛或者看起來沒有努力,請原諒我。 我需要改進只能接受字母數字字符「 - 」,「_」,「。」,「/」,「:」,「」的模式。按照下面的人建議使用正則表達式。

現在這個正則表達式似乎工作:

\[source=[A-Za-z0-9-_ \\\/.:]+\] 

下一步串每場比賽,以消除開放標籤「[來源=」和結束標記「]」

任何更好的主意,以減少過程?

+3

你想喝杯咖啡呢? – vks

+1

到目前爲止您嘗試過什麼?發佈呢? –

+0

Google RegEx。它可以很容易地完成你所要求的。 – SILENT

回答

1

你只需要\[source=([A-Za-z0-9-_ \\/.:]+)\](如果你並不需要匹配一個反斜槓。刪除\\)使用match.Groups[1].Value並訪問值而不最後]和初始[source=

var res = Regex.Matches(str, @"\[source=([A-Za-z0-9-_ \\/.:]+)\]").Cast<Match>().Select(match => match.Groups[1].Value).ToList(); 

C# demo

var str = "jkasdlue as 12&sdaj__3982[source=saj_/29]sj*2&7^;'asj[source=-js/.2]_jsld+=[source=283]"; 
var res = Regex.Matches(str, @"\[source=([A-Za-z0-9-_ \\/.:]+)\]").Cast<Match>().Select(match => match.Groups[1].Value).ToList(); 
Console.WriteLine(String.Join("\n", res)); 

結果:

saj_/29 
-js/.2 
283 

需要注意的是,也可以使用查找變通得到的結果,而是因爲他們是 「貴」,少有效而且在這裏沒有必要,我不會建議使用它。這裏是鏈接到一個regex demo

(?<=\[source=)[A-Za-z0-9-_ \\/.:]+(?=\]) 
^^^lookbehind^     ^^^^^^ - lookahead   

而在C#:

var res = Regex.Matches(str, @"(?<=\[source=)[A-Za-z0-9-_ \\/.:]+(?=\])").Cast<Match>().Select(match => match.Value).ToList(); 
+0

所以設置模式爲我們只需要把「(」和「)」的組?我會嘗試這一個。謝謝。 –

+0

讓我們這樣說吧:在.NET正則表達式模式中,應該將模式的一部分包含在未轉義的括號中以訪問子匹配。當你不需要重疊匹配和沒有特定的上下文需求時,你不需要lookaround,儘管這樣你會得到一個更清晰的匹配結果。性能是關鍵,捕獲機制最爲高效,幾乎可在所有平臺上使用。 –

相關問題