C++ 返回字符串中模式的所有非重叠匹配项

C++ 返回字符串中模式的所有非重叠匹配项,c++,python,regex,pattern-matching,C++,Python,Regex,Pattern Matching,在Python中,我可以使用re.findall(pattern,string)返回字符串中模式的所有非重叠匹配 例如,在以下SVG path命令中: import re spam = "M317.0,169.7C311.1,170.5 285.7,146.8 300.7,178.57 L 321.4,175.01" eggs = re.findall("([A-Za-z]|-?[0-9]+\.?[0-9]*(?:e-?[0-9]*)?)", spam) print(eggs) ['M', '3

在Python中,我可以使用re.findall(pattern,string)返回字符串中模式的所有非重叠匹配

例如,在以下SVG path命令中:

import re
spam = "M317.0,169.7C311.1,170.5 285.7,146.8 300.7,178.57 L 321.4,175.01"
eggs = re.findall("([A-Za-z]|-?[0-9]+\.?[0-9]*(?:e-?[0-9]*)?)", spam)
print(eggs)
['M', '317.0', '169.7', 'C', '311.1', '170.5', '285.7', '146.8', '300.7', '178.5', 'L', '321.4', '175.0']

<>这有一种轻量级、干净、高效的方法来进行C或C++中的正则表达式模式匹配?请注意,我不是在寻找一个依赖于Boost的解决方案。理想的是,我想最小化依赖关系,并保持我的代码精益…

你需要一个C++正则表达式库。它们有很多,但它们将创建一个依赖项。C++没有原生(或STL)正则表达式支持。

< P> <强> SLR-超轻正则表达式库>/P> 是一个ANSIC库,它实现了Perl正则表达式的一小部分。它主要面向那些想要解析配置文件的开发人员,因为速度并不重要。它位于单个.c文件中,可根据自定义需要轻松修改。例如,如果想引入一个新的元字符“\i”,意思是“IP地址”,很容易做到。 特征

*跨平台-纯ANSI C

*非常简单的API

*轻:编译时大约5kB的代码

*不使用动态内存分配

*线程安全

支持重新语法

^匹配缓冲区的开头

$匹配缓冲区的结尾

()分组和子字符串捕获

[…]匹配集合中的任何字符

[^…]匹配除集合中的字符外的任何字符

\s匹配空白

\S匹配非空白

\d匹配十进制数字

\r匹配回车符

\n匹配换行符

+匹配一次或多次(贪婪)

+?匹配一次或多次(非贪婪)

*匹配零次或多次(贪婪)

*?匹配零次或多次(非贪婪)

?匹配零或一次

\xDD将字节与十六进制值0xDD匹配
\meta匹配其中一个元字符:^$().*+?\

/*
 * ----------------------------------------------------------------------------
 * "THE BEER-WARE LICENSE" (Revision 42):
 * Sergey Lyubka wrote this file. As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you think
 * this stuff is worth it, you can buy me a beer in return.
 * ----------------------------------------------------------------------------
 */

不幸的是,标准C++语言没有正则表达式函数。你必须使用<代码> STD::String 或使用外部库来创建一些东西。你需要添加一些库,并且Boost做很多事情,本质上是终极可移植性,那么为什么不使用它呢?(C++ 0x增加了ReXEPS,但它是一个在添加过程中被添加到库中的特性。)<代码> Boost 是几乎任何C++项目中都值得拥有的依赖项。