C#使用pattern查找大字符串中的所有子字符串

时间:2015-11-14 05:05:32

标签: c# arrays regex

考虑我有以下字符串:

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

我想得到以下字符串数组的输出:

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

任何帮助将不胜感激。感谢。

更新

好。请原谅我,如果我的问题太宽泛或者似乎没有我的努力。 我需要改进应该只接受字母数字字符的模式,“ - ”,“_”,“。”,“/”,“:”,“”。按照下面的某些建议使用正则表达式。

现在这个正则表达式似乎有效:

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

下一步对每个匹配进行子串,以消除开放标记“[source =”和close标记“]”

减少这个过程还有什么好主意吗?

1 个答案:

答案 0 :(得分:2)

您只需要\[source=([A-Za-z0-9-_ \\/.:]+)\](如果您不需要匹配反斜杠。请移除\\)并使用{{][source=初始match.Groups[1].Value访问该值1}}。

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();