正则表达式 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
的可选重复
(?<WORD>
命名组 WORD
[^\sA].*
匹配除 A 以外的任何非空白字符
)
关闭命名组WORD
(?<=^.8)
断言当前位置左边8个字符
.NET regex demo
如果你只想匹配单词字符:
^A*(?<WORD>[^\WA]\w*)(?<=^\w8)
.NET Regex demo
【讨论】:
以上是关于正则表达式 c# 获取捕获组的子组的主要内容,如果未能解决你的问题,请参考以下文章