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

标签 c++ python regex pattern-matching

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

例如,在下面的 SVG 路径命令中:

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 的解决方案。理想情况下,我想尽量减少依赖性并保持我的代码精简...

最佳答案

SLRE - 超轻正则​​表达式库

SLRE是一个 ANSI C 库,它实现了 Perl 正则表达式的一小部分。它主要针对想要解析配置文件的开发人员,其中速度并不重要。它位于单个 .c 文件中,可根据自定义需求轻松修改。例如,如果要引入一个新的元字符“\i”,意思是“IP 地址”,这样做很容易。 特点

* 跨平台 - 纯 ANSI C
* 非常简单的 API
* 轻量级:编译时大约 5kB 的代码
* 不使用动态内存分配
* 线程安全

支持的 RE 语法

^ 匹配缓冲区的开头
$ 匹配缓冲区的结尾
() 分组和子串捕获
[...] 匹配集合中的任意字符
[^...] 匹配除集合中的字符以外的任何字符
\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++ - 返回字符串中模式的所有非重叠匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2255302/

相关文章:

c++ - 如何使用 std::regex?

c++ - 卡在 _dl_sysinfo_int80 上的多线程应用程序

c++ - xcode 将工作目录更改为产品目录

python - 属性错误 : 'ModuleSpec' object has no attribute 'load_data_wrapper'

python - 如何将参数传递给 animation.FuncAnimation()?

regex - 查找 'posix-extended' 和 'posix-egrep' 之间的命令正则表达式差异

c++ - R 和 C++ 中的相同计算返回不同的结果?

c++ - 在 .cpp 文件中定义 C++ 命名空间方法的正确方法

python - 没有斜杠的 django url 不会重定向

带或不带尾部斜杠的 PHP RegEx