正则表达式 c# 获取捕获组的子组

Posted

技术标签:

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

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

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

我尝试使用此正则表达式(?^[A]<WORD>\w8),但我不知道如何在捕获的名为 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 修剪掉。 【参考方案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*)(?<=^\w8)

.NET Regex demo

【讨论】:

以上是关于正则表达式 c# 获取捕获组的子组的主要内容,如果未能解决你的问题,请参考以下文章

c# 正则表达式捕获

python中的正则表达式中的 ""

[javascript] 获取正则子表达式里的内容

如何获取正则表达式捕获组的值? [复制]

正则表达式匹配

将排除捕获组的正则表达式