正则表达式:如何获取字符串中组的所有匹配项

Regex: How to get all matches of a group in a string

我有以下正则表达式

.*context\.Database\.SqlQuery<[A-Za-z]+>\("(?<sqlStatement>.*?[^\])"\)

我有以下字符串

context.Database.SqlQuery<string>("select [Name] from [DomainModel] where UniqueId = 'someGuid'").Single();context.Database.SqlQuery<string>("select [Description] from [DomainModel] where UniqueId = 'someGuid'").Single();

我需要匹配所有出现的 context.Database.SqlQuery<string>("") 并提取这些括号之间的字符串。 当我像这样拆分字符串来测试它时:

context.Database.SqlQuery<string>("select [Name] from [DomainModel] where UniqueId = 'someGuid'").Single();
context.Database.SqlQuery<string>("select [Description] from [DomainModel] where UniqueId = 'someGuid'").Single();

它工作正常。我需要让它在前面的场景中工作,匹配的输出应该是这样的

第一场比赛

select [Name] from [DomainModel] where UniqueId = 'someGuid'

第二场比赛

select [Description] from [DomainModel] where UniqueId = 'someGuid'

这里是regexr

你的问题是开头的.*。由于它可以匹配所有内容,因此最终会选择除最后一个之外的所有匹配项。

如果你只是放下它,你的模式可以拾取每一个。

context\.Database\.SqlQuery<[A-Za-z]+>\("(?<sqlStatement>.*?[^\])"\)

问题出在 .* 因为 . 匹配除换行符以外的任何字符。 并且 * 量化正则表达式以在零次和多次之间进行匹配。

您只需要从给定正则表达式的开头删除 .*Here 是给定问题的工作示例