Regex: Как получить все совпадения группы в строке

У меня есть следующее регулярное выражение

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

Работает нормально. Мне нужно, чтобы он работал по предыдущему сценарию, и вывод совпадений должен быть таким

первый матч

выберите [Имя] из [DomainModel], где UniqueId = 'someGuid'

второй матч

выберите [Description] из [DomainModel], где UniqueId = 'someGuid'

вот регулярное выражение для этого.

2 ответа

Решение

Ваша проблема заключается в .* в самом начале. Поскольку это может совпадать со всем, то заканчивается подбор всех совпадений, кроме последнего.

Если вы просто отбросите это, ваш паттерн может подобрать каждый.

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

Проблема с .* поскольку . соответствует любому символу, кроме новой строки. а также * квантифицирует регулярные выражения для совпадений от нуля до нескольких раз.

Вам просто нужно удалить .* с начала данного регулярного выражения. Вот рабочий пример данной проблемы

Другие вопросы по тегам