Regex.Matches находит наименьшее количество символов для каждого найденного соответствия - PullRequest
2 голосов
/ 20 июня 2019

Я хочу перебирать каждое совпадение, но мой код находит только 1 совпадение, получая все между первым и последним символом, найденным в шаблоне.

По сути, я хочу перебрать 3 совпадения, найденных в следующей строке:

value = "{account_id}{user_id}{someValue}";

Значение может включать любое количество этих подстрок "{str}", где str - символы верхнего или нижнего регистра и могут содержать _.

Но он находит только 1 совпадение (целое) по следующей схеме: "{\\S+}"

foreach (Match match in Regex.Matches(value, "{\\S+}"))
{
    var key = match.Value.Replace("{", "").Replace("}", "").Trim();
    // do stuff with key...
}

Это имеет смысл, потому что "{" и "}" не являются символами пробела, поэтому я попытался использовать "{[a-zA-Z_]}", но это тоже не удалось.

foreach (Match match in Regex.Matches(value, "{[a-zA-Z_]}"))
{
    var key = match.Value.Replace("{", "").Replace("}", "").Trim();
    // do stuff with key...
}

Ключ переменной в цикле должен быть «account_id», затем «user_id», затем «someValue», однако это всегда «account_iduser_idsomeValue (все это).

Как я могу это исправить?

РЕДАКТИРОВАТЬ: я только что попытался добавить * в конец шаблона, но он возвращает только 2 совпадения (пустой набор и все снова). Использование + вместо этого вернет только 1 результат (все это, а не пустой набор), который ничем не отличается. enter image description here

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Я исправил это, используя ({[a-zA-Z_]+}) в качестве шаблона.Чтобы понять это, потребовалось много догадок и настроек.

0 голосов
/ 20 июня 2019

Это потому, что вы не учитываете множественные вхождения {} в тексте для поиска. Добавьте квантификаторы к своему регулярному выражению, например "({\\w})*", и вы должны хорошо использовать несколько захватов.

Переключите * на +, если всегда будет хотя бы 1 совпадение.

...