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

C#使用模式查找大字符串中的所有子字符串,c#,arrays,regex,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"} 任何帮助都将不胜感激。谢谢 更新 好的。请原谅,如果我的问题太宽泛或似乎我没有努力。 我需要改进只接受字母数字字符的模式,“-”、“”、“/”、“:”、”。按照下面的建议使用正则表达式 目前,这个

假设我有以下字符串:

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=”和关闭标记“]”


有没有更好的方法来减少这个过程?

您只需要
\[source=([A-Za-z0-9-\\\/.:]+\]
(如果您不需要匹配反斜杠。请删除
\
)并使用
match.Groups[1]访问不带最后一个
]和首字母
[source=
的值

var res = Regex.Matches(str, @"\[source=([A-Za-z0-9-_ \\/.:]+)\]").Cast<Match>().Select(match => match.Groups[1].Value).ToList();
请注意,也可以使用环顾法获得结果,但由于环顾法“昂贵”、效率较低且此处不必要,因此我不建议使用环顾法。以下是一个链接:

(?match.Value).ToList();

你也想喝点咖啡吗?到目前为止你都试了些什么?也发了帖子吗?@vks,态度如何?这家伙显然是新来的,用一些建设性的东西欢迎他怎么样?此外,为什么这被标记为离题?他在C#和regex下标记了他的问题,表明他正在寻找一个正则表达式来解决这个问题解决他的问题。他还提供了他的输入字符串和预期的输出。我真的看不出这里有什么混乱…@vks,新的或不新的..我不认为有必要讽刺..无论如何,他的问题有什么问题?我很清楚。@Matt,谢谢你的支持。我想这是我的错。有时我在这样的问题中发现一些愚蠢的问题几乎不费吹灰之力,但它拥有如此多的选票。也许他/她只是如此受欢迎,所以只要把任何东西放进去,它就会有很多选票。你知道,就像facebook或twitter:)所以要将模式设置为组,我们只需要放“(“和”)”?我会试试这个。谢谢。让我们这样说:在.NET正则表达式模式中,应该将模式的一部分括在未开槽的括号中,以便访问子匹配。当您不需要重叠匹配和特定上下文要求时,您不需要查找,尽管这样可以获得更清晰的匹配结果。性能是关键而且捕获机制是最有效的,几乎可以在所有平台上使用。
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
(?<=\[source=)[A-Za-z0-9-_ \\/.:]+(?=\])
^^^lookbehind^                    ^^^^^^ - lookahead          
var res = Regex.Matches(str, @"(?<=\[source=)[A-Za-z0-9-_ \\/.:]+(?=\])").Cast<Match>().Select(match => match.Value).ToList();