匹配由前缀后的空格分隔的字符序列

时间:2019-08-28 16:44:50

标签: c# regex

我有以下字符串:

  1. -prefix <@141222969505480701>,其中第二部分例如<@141222969505480701>可以无限次重复(只有数字改变)。
  2. -prefix 141222969505480701,其行为应与上面相同。
  3. -prefix 141222969505480701 <@141222969505480702>,它仍然可以永远重复一遍。

最后一个应该具有包含141222969505480701141222969505480702的组。

一些信息:

  • 数字链总数始终为18,所以我在正则表达式中使用\ d {18}
  • 我希望将数字分组,以便以后使用。

我尝试过的

我首先尝试匹配示例字符串中的第一个。 -prefix(\s<@\d{18}>)\1*可以匹配整个字符串,但是我希望数字本身位于自己的组中。同样,此方法仅匹配相同的部分,例如<@141222969505480701> <@141222969505480701> <@141222969505480701>会匹配,但是介于两者之间的任何其他数字都不会匹配。

在我脑海中听起来什么合乎逻辑

-prefix (\d{18})+,但仅与“数字部分”的第一个匹配。

当我在regex101上进行测试时,它告诉我以下内容:

  

重复捕获组将仅捕获最后一次迭代。将捕获组放在重复的组周围以捕获所有迭代,或者如果您对数据不感兴趣,则使用非捕获组。

我尝试将正则表达式调整为以下-prefix ((\d{18})+),但结果相同。

2 个答案:

答案 0 :(得分:1)

在评论中@madreflection的帮助下,我提出了以下解决方案:

-prefix([\s]*(<@|)(?<digits>[0-9]{18})>?)+

这正是我需要的,甚至忽略了它们之间的空格。另外,使用match.Groups["digits"].Captures可以使整个故事变得容易得多。

答案 1 :(得分:0)

您可以使用alternation列出3种不同的允许格式。在.NET中,支持重用组名。

-prefix\s*(?:(?<digits>[0-9]{18})\s*<@(?<digits>[0-9]{18})>|(?<digits>[0-9]{18})|<@(?<digits>[0-9]{18}))

样式部分

  • -prefix\s*字面匹配,后跟0+个空白字符
  • (?:非捕获组
    • (?<digits>[0-9]{18})\s*<@(?<digits>[0-9]{18})> 2个与数字匹配的命名捕获组
    • |
    • (?<digits>[0-9]{18})命名为捕获组,仅匹配数字
    • |
    • <@(?<digits>[0-9]{18})命名为捕获组,仅在方括号之间匹配数字
  • )

Regex demo

enter image description here

您还可以使用2个命名的捕获组,每种格式1个。例如:

-prefix\s*(?:(?<digits>[0-9]{18})\s*<@(?<digitsBrackets>[0-9]{18})>|(?<digits>[0-9]{18})|<@(?<digitsBrackets>[0-9]{18}))

Regex demo