从字符串捕获组

时间:2018-12-02 20:13:39

标签: regex

我有一个像这样的字符串

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 :(得分:2)

此正则表达式可以完成您的工作。但是,由于没有给出一般的匹配要求,因此您想要分组匹配的内容显得有些奇怪。这是正则表达式,

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

Demo

如果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

Demo with expected string where iPad is followed by Price

答案 1 :(得分:0)

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}");
}

答案 2 :(得分:0)

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+?€)

Demo