захватить группу из строки - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть строка с чем-то вроде этого

Item 1: MacBook Pro Price 1000€ Item 2: MacBook Air Price 900€ Item 3: iPad 300€ Infinity Loop 1

Я хочу регулярное выражение с 3 матчами, каждая с двумя группами.

  • MacBook Pro, 1000 €
  • MacBook Air, 900 €
  • iPad, 300 €

Ответы [ 3 ]

0 голосов
/ 02 декабря 2018
var s = @"Item 1: MacBook Pro Price 1000€ Item 2: MacBook Air Price 900€ Item 3: Cool iPad 300€ Infinity Loop 1";
var pattern = @"Item\s\d+:\s((?'name'.+?)\s(?'price'\d+€))";
var matches = Regex.Matches(s, pattern);
foreach(Match match in matches)
{
    Console.WriteLine($"Match: {match.Value}");
    Console.WriteLine("\tGroups:");
        Console.WriteLine($"\t\t{match.Groups["name"].Value}");
        Console.WriteLine($"\t\t{match.Groups["price"].Value}");
}
0 голосов
/ 04 декабря 2018
Item 1: MacBook Pro Price 1000,00€ Item 2: MacBook Air Price 900,00€ Item 3: iPad Price 300,00€ Infinity Loop 1

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

(?<=Item\s\d: )(\w.*?) Price (\d*?,\d+?€)

Демо

0 голосов
/ 02 декабря 2018

Это регулярное выражение делает вашу работу.Но то, что вы хотите сопоставить в группе, выглядит немного странно, так как никаких общих требований соответствия не дано.Вот регулярное выражение:

Item 1:\s+(.*?)\s*Price.*?:\s+(.*?)\s*Price.*:\s+([^\d]+)\s+\d+

Демо

Если заданная строка в OP была такой,

Item 1: MacBook Pro Price 1000€ Item 2: MacBook Air Price 900€ Item 3: iPad Price 300€ Infinity Loop 1

Тогда регулярное выражение было бы более последовательным и было бы написано так:

Item 1:\s+(.*?)\s*Price.*?:\s+(.*?)\s*Price.*:\s+([^\d]+)\s*Price

Демонстрация с ожидаемой строкой, в которой за iPad следует цена

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...