【问题标题】:Regex c# obtain subgroup of a captured group正则表达式 c# 获取捕获组的子组
【发布时间】:2021-08-02 20:42:04
【问题描述】:

这似乎是一个简单的问题,但我认为这并不容易。

从示例字符串 AAACARACBBBBBDZAAAAEE 中,我想提取前 8 个字符 (= AAACARAC),然后从生成的 8 字符长字符串中,我想提取除前导 'A' 字符之外的所有内容 ( = CARAC)。

我尝试使用此正则表达式(?^[A]<WORD>\w{8}),但我不知道如何在捕获的名为 WORD 的组上应用另一个正则表达式?

【问题讨论】:

  • 为什么不简单地尝试一下 WORD.TrimStart('A')?正则表达式是一件好事,但不是“治愈一切”的东西......
  • @horcrux 谢谢你的建议,但如果我做你的建议,结果是 CARACBBB(它附加了 BBB),我只想要 CARAC。
  • 如果你想要前 8 个字符,那么只需使用字符串方法 substring。 :字符串输入=“AAACARACBBBBBDZAAAAEE”;字符串输出 = 输入。子字符串(0,8);然后应用正则表达式。
  • 如果你使用 C#,你可以这样做 new string(str.Take(8).SkipWhile(c => c == 'A').ToArray())
  • @LocEngineer 显然 A 的数量很重要,因为他想匹配到原始字符串的第 8 个字符,所以你不能把所有的 As 修剪掉。

标签: c# regex


【解决方案1】:

这是你想要的正则表达式:

(?=^.{8}(.*)$)A*(?<WORD>.*?)\1$

查看演示 here(然后单击“表格”查看特定匹配项)。

正则表达式 firs 将匹配前 8 个字符以查找接下来的内容(匹配第一个捕获组中的此“尾部”),然后将从字符串的开头重新开始,排除所有尾随 As 并匹配 as less 字符尽可能使这些字符后跟第一个捕获组的相同内容。

【讨论】:

  • 非常感谢@horcux,这正是我所需要的,您为我节省了几个小时的时间。我将通过文档了解正则表达式,以提高我的正则表达式技能。谢谢
【解决方案2】:

使用 C#,您还可以使用正向回溯来断言左侧的 8 个字符,匹配可选的 A 并捕获组中后面的字符。

^A*(?<WORD>[^\sA].*)(?<=^.{8})
  • ^ 字符串开始
  • A* 匹配 A 的可选重复
  • (?&lt;WORD&gt; 命名组 WORD
    • [^\sA].* 匹配除 A 以外的任何非空白字符
  • )关闭命名组WORD
  • (?&lt;=^.{8})断言当前位置左边8个字符

.NET regex demo

如果你只想匹配单词字符:

^A*(?<WORD>[^\WA]\w*)(?<=^\w{8})

.NET Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-05
    • 2015-07-24
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    相关资源
    最近更新 更多