对于以下问题,我很难找出正则表达式(我很遗憾几乎没有遇到过):
ab4
)4
中ab4
代表的内容),每个字符可以是ASCII字母数字,空格,括号,连字符或点(基本上是a-zA-Z0-9 ()-.
)。示例:abcd
,.b a
,
,b(a.)
都是有效的单个区块。ab4
是唯一的内容)或最多包含四个块(ab4xxxx
,ab4xxxxxxxx
,ab4xxxxxxxxxxxx
,ab4xxxxxxxxxxxxxxxx
x
是有效的角色)\r\n
)。结尾被视为终止字符,不是正文的一部分到目前为止,我已经提出了
.*ab4([a-zA-Z0-9 ()-.]{4}){1,4}\\r\\n.*
在将其添加到我的C ++代码之前,我使用regular expressions 101来验证我的正则表达式。但是,如果我输入
ab4aaa bbb ccc ddd \r\n
我得到以下统计数据:
完全匹配:
0-25 'ab4aaa bbb ccc ddd \r\n'
第1组。
15-19 'ddd '
正则表达式验证程序告诉我
重复捕获组仅捕获最后一次迭代。放一个 捕获重复组周围的组以捕获所有迭代或 如果您对数据不感兴趣,请使用非捕获组
但坦率地说我不知道这意味着什么。我尝试了(([a-zA-Z0-9 ()-.]{4}){1,4})
并没有太大改变。
我正在寻找一个更好的分组,即将4个区块分开作为单独的组。对于上面的示例,我期待
完全匹配:
0-25 'ab4aaa bbb ccc ddd \r\n'
0-3 'aaa '
4-7 'bbb '
8-11 'ccc '
12-15 'ddd '
答案 0 :(得分:2)
您使用的PCRE正则表达式引擎(QRegularExpression
)不支持每个组的捕获堆栈,因此您必须使用两步法:
第一个提取正则表达式将是
ab4((?:[a-zA-Z0-9 ().-]{4}){1,4})\\r\\n
^ ^ ^
注意我在您感兴趣的部分周围添加了捕获括号,并且连字符位于字符类的末尾。
使用文本中的extract all matches模式。
然后将match.captured(1)
拆分为substrings of length 4。您不需要在此步骤中使用正则表达式,因为在第一个正则表达式步骤中字符串已经过预验证。