gpt4 book ai didi

c# - 正则表达式获取捕获组直到到达另一个部分

转载 作者:行者123 更新时间:2023-11-30 22:59:39 26 4
gpt4 key购买 nike

试图找出一个 RegEx 来捕获一个组的多个实例,但仅限于某个点。

例如:

START

City: Los Angeles
- Item: 48
- Item: 57
- Item: 92
- Item: 77

City: Austin
- Item: 44
- Item: 88

END

我正在尝试编写一个将仅返回洛杉矶项目的正则表达式(例如:48、57、92、77)。下面的模式涵盖了所有这些,但我只想要洛杉矶。

 -\s*Item:\s*(?<itemnum>[0-9]{1,5})

1 个正则表达式是否可行?

最佳答案

是的,你可以使用像这样的正则表达式

(?m)^City:\s*Los Angeles(?:\s*-\s*Item:\s*(?<itemnum>\d+))+

参见 regex demo .您需要使用 Regex.Matches并访问组“itemnum”捕获堆栈以检索所有值。

图案细节

  • (?m)^ - 行首
  • City:\s*Los Angeles - City: , 0+ 空格, Los Angeles
  • (?:\s*-\s*Item:\s*(?<itemnum>\d+))+ - 一次或多次出现:
    • \s*-\s* - 一个 -用 0+ 个空格括起来
    • Item: - 文字 Item:子串
    • \s* - 0+ 个空格
    • (?<itemnum>\d+) - 组“itemnum”:一个或多个数字。

参见 C# demo :

var s = "START\r\n\r\nCity: Los Angeles\r\n- Item: 48\r\n- Item: 57\r\n- Item: 92\r\n- Item: 77\r\n\r\nCity: Austin\r\n- Item: 44\r\n- Item: 88\r\n";
var pattern = @"(?m)^City:\s*Los Angeles(?:\s*-\s*Item:\s*(?<itemnum>\d+))+";
var result = Regex.Matches(s, pattern)
.Cast<Match>().SelectMany(p => p.Groups["itemnum"].Captures
.Cast<Capture>()
.Select(x => x.Value));
Console.WriteLine(string.Join(", ", result));
// => 48, 57, 92, 77

替代解决方案:使用 \G基于模式:

(?m)(?:^City:\s*Los Angeles|\G(?!\A))\s*-\s*Item:\s*(\d+)

参见 regex demo .基本上,它是相同的((?:^City:\s*Los Angeles|\G(?!\A)) 匹配 City: Los Angeles 并且后续匹配只允许在前一个匹配结束位置的末尾),但检索更容易:

var result = Regex.Matches(s, pattern)
.Cast<Match>()
.Select(p => p.Groups["itemnum"].Value)
.ToList();

关于c# - 正则表达式获取捕获组直到到达另一个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52066954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com