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>.*?[^\\])"\)
Проблема с .*
поскольку .
соответствует любому символу, кроме новой строки. а также *
квантифицирует регулярные выражения для совпадений от нуля до нескольких раз.
Вам просто нужно удалить .*
с начала данного регулярного выражения. Вот рабочий пример данной проблемы