我想知道是否可以调用子程序,但不捕获该调用的结果。未捕获子程序
举例来说,假设我想递归匹配和捕获平衡括号{}结构像
{dfsdf {sdfdf {{dfsdf}}} dfsf}
我可以使用这正则表达式:
(^(?'nest'\{(?>[^{}]|(?&nest))*\}))
第一组是我想要捕获。
但是我的 '鸟巢' 的定义:
(?'nest' ...)
和我的 '鸟巢' 子程序递归调用:
(?&nest)
也捕获组。我想通过不捕获这些组来提高我的正则表达式的效率并节省空间。有没有办法做到这一点?
编辑:我预计它不可能不捕获子程序定义,因为它的模式需要被捕获以供其他地方使用。
EDIT2:
我测试这个表达式用的boost ::正则表达式以及记事本+ +正则表达式。他们实际上出现了定义不同的捕获组,这对我来说很奇怪。我觉得他们都默认使用Perl正则表达式。
无论如何,在问这个问题,我有正则表达式:
^\w+\s+[^\s]+\s+(?'header'(?'nest'\{(?>[^{}]|(?&nest))*\}))(?>\s+[^\s]+){5}\s+(?'data'(?>\{(?>[^{}]|(?&nest))*\}))\s+(?'class'(?>\{(?>[^{}]|(?&nest))*\}))
这是我后来才意识到包含不必要的字符“鸟巢”已经封装。而我现在有:
^\w+\s+[^\s]+\s+(?'nest'\{(?>[^{}]|(?&nest))*\})(?>\s+[^\s]+){5}\s+((?&nest))\s+((?&nest))
记事本+ +为我提供了3组拍摄的时候我做了REPLACE语句
\\1: \1 \n \\2: \2 \n 3: \3 \n 4: \4
它告诉我,“出现1次被换下,接下来发生未找到”。 4:之后替换没有文字,使我相信第4个捕获组不存在。
无论其升压:: regex_match返回与6个位置的对象:
0:对比赛元数据
1:整个匹配
2:整个匹配
3: group1 from notepad ++
4:group2 from notepad ++
5:从记事本++
组3我还在努力使位置1的发送和2
EDIT3
我误解又一块拼图...
boost :: cmatch.m_subs [i]!= boost :: cmatch [i]
我以为他们是平等的。一些调试后,事实证明,索引到对象的操作完全相同的文件说。但是,我错误地假定对象将包含镜像[I]返回什么的boost :: C匹配的结构。看来,升压:: C匹配[I]首先去除具有匹配的==假m_subs所有条目。剩下的条目与boost :: cmatch [i]返回的内容一致。
如果您需要在字符串开头匹配那个'{...}'均衡子字符串,否则无法使用非捕获子例程调用。 –
这有什么理由吗?看起来这个功能会增强正则表达式的功能。 – Derek
我宁愿称之为过早优化。 –