喜欢正则和 python 的 C++er 来看下

2016-03-08 14:01:55 +08:00
 xuboying

平时主要从事日志、数据分析工作,早些年接触了 Perl, 对其自带的正则表达式爱不释手,后来赶时髦也学习了 python , c++,每隔一两个月更新一下自己写的 C++工具。发现 C++ 没有很好的正则库( STL 的太弱),就引入了 PCRE,但 PCRE 的接口调用麻烦,文档太少。先是随意分装了自己一个 C++版本,几个月不用居然忘记用法了,现在决定按照 Python 的语法,封装 PCRE2,这样,每次要用的时候只要参考 python 的文档就行了

库设计的很简单,用 auto 和智能指针,使得语法和 python 基本近似,对宽字符的处理也做了很好的处理,有完整的文档和实例,如果喜欢这个项目,请给个小小的 star 。谢谢

https://github.com/xuboying/PCRE2Plus

2732 次点击
所在节点    程序员
13 条回复
msg7086
2016-03-08 14:41:59 +08:00
如果对 Perl 的正则爱不释手的话,不试试 Ruby 吗(拖走
xuboying
2016-03-08 14:54:37 +08:00
@msg7086 使用何种语言往往不是 coder 决定的啦
TangMonk
2016-03-08 15:01:43 +08:00
Owenjia
2016-03-08 15:08:18 +08:00
boost 的 regex 不好用么?
xuboying
2016-03-08 15:12:38 +08:00
@Owenjia boost 的没有用过唉,不过我只想记忆一套正则,就是 Perl/PCRE 的正则,这个标准做的最好, python 的也和它兼容,语法上, python 的文档写的非常好,初学者一看就懂。
skydiver
2016-03-08 15:17:48 +08:00
好像发错节点了,应该发到分享创造
alexapollo
2016-03-08 15:24:42 +08:00
looks good
Owenjia
2016-03-08 20:21:24 +08:00
@xuboying
没记错的话 boost_regex 默认是 PCRE 的吧?
xuboying
2016-03-08 20:58:54 +08:00
@Owenjia 好像是。这个项目目的是多个选择吧,我每个项目都会考虑用正则,但不会都想用 boost 。用 Python 的语法也是为了简化 port Python prototype 到 c++的步骤。还有 pcre 貌似不支持替换,这是我后来换 pcre2 的原因。
patrickstar
2016-03-09 09:12:58 +08:00
不错,有空来测试一下子,很想有个单纯的 C++的正则库,装个 boost 来仅用正则式,感觉好像为了吃点猪肉而来杀一头猪一样
patrickstar
2016-03-15 16:06:44 +08:00
@xuboying 请教一下子,如何在 pcre2_substitute() 函数中使用 后向引用 啊?

比如我想把"cat in the the hat"中重复的 the 去掉一个, pattern = "(\b[a-z]+) \1", replacement = "\1"

结果一执行,把两个 the 替换为 \1 了,好像它不对 replacement 参数做引用解释!

谢谢
xuboying
2016-03-15 19:05:41 +08:00
@patrickstar 这个我在 soc 文档里提到了,你要用 $1 来替换\1 ,
我用了 PCRE 文档里的 PCRE2_SUBSTITUTE_EXTENDED ,但似乎还是不能用\1


e.sub(pattern, repl, string, count=0, flags=0)

Supported

static std::string re::sub(const std::string & pattern, const std::string & repl, const std::string & Str, size_t count = 0, int flags = 0)

static std::wstring re::sub(const std::wstring & pattern, const std::wstring & repl, const std::wstring & Str, size_t count = 0, int flags = 0)

Error Handling: pattern only

NOTE: \x e.g(\1) as group reference in repl text is not support, use $x e.g $1 instead
patrickstar
2016-03-16 08:06:32 +08:00
@xuboying 试了一下子,没看出 PCRE2_SUBSTITUTE_EXTENDED option 有啥子作用,但是对于 pcre2_substitute() 采用 \$1 来取代 \1 进行后向引用是可行的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/261909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX