精易论坛

标题: 【原创】epcre2:基于PCRE2的正则表达式模块 支持Unicode [打印本页]

作者: 小白熊    时间: 2019-8-30 22:39
标题: 【原创】epcre2:基于PCRE2的正则表达式模块 支持Unicode
本帖最后由 小白熊 于 2019-8-31 16:45 编辑

“基于PCRE2的完全封装+功能扩展正则表达式模块!!!”
关于PCRE2:

    pcre2是一个超强大的正则表达式库,它与Perl兼容,有众多的程序嵌入了它 比如 PHP、Nginx等

Unicode支持:
    pcre2有三个库,libpcre2-8、libpcre2-16、libpcre2-32,分别支持 1字节代码单元(UTF-8)、2字节代码单元(UTF-16)、4字节代码单元(UTF-32)。

   这三个库我都已经编译并且放入压缩包,模块也实现完全封装全部支持,在普通使用中我们只需要用到 libpcre2-8这个库,如果需要Unicode支持则需要用到libpcre2-16这个库而libpcre2-32为32位代码单元支持,模块也支持,根据需求使用选择库。


模块公开的函数和类:

使用说明:
P_正则全局加载链接库:加载全局链接库(载入DLL)
P_正则编译表达式:编译一个表达式,如果成功返回表达式句柄
P_正则内容替换:进行匹配和替换
P_正则内容高级替换:进行匹配和替换,不同于内容替换的是这个功能允许使用 \0 \1 \2这种类型的格式字符串传入,用以匹配 完整表达式捕获、第一个子表达式捕获、第二个子表达式捕获,同理支持最大\99

假设表达式为:(\d+)*(\d+),文本内容为:“100*200”,此处的格式为:“\1 => \2”,则最终替换返回的结果为:“100 => 200”

P_正则内容匹配:此功能用于判断某个文本是否与表达式匹配,匹配成功返回真,否则返回假
P_正则内容搜索:此函数通过已编译的表达式进行搜索内容,如果成功将返回一个搜索结果指针,如果启用全部搜索则返回一个搜索结果数组指针,如果无匹配返回0
。。。。。不一一叙述了,模块内有注释,不懂可以加下面的群
P_正则表达式类 封装于面向过程为类
P_正则表达式_便捷 与 P_正则表达式类 相同,但更加便捷操作

所有函数名称带W的表示支持 8/16/32 位字符单元模式(使用16位模式即可支持通常的Unicode),普通模式不支持宽文本的函数有备注

关于JIT:

    pcre2库支持JIT编译表达式,启用JIT编译在编译时稍微多耗费一些时间,但在匹配时速度快得多,这通常运用于单个模式进行多次匹配时需要


关于命名子表达式:

    表达式允许加入‘命名标签’,使用命名标签的格式:(?<名称>(子表达式))
例如表达式:(?<name>([1-9][0-9]{4,}))  匹配文本:jhbxwe8769933jdhxcn 那么将会匹配到 8769933 ,由于前面命名子表达式为name,则可以使用 P_正则取子匹配文本_从名称(搜索结果,name)来获取到 8769933


其他
   懒得排版帖子,大伙凑合看,新建了一个易语言交流群,了解我的更多作品和我正在开发的东西,或者BUG反馈,使用说明等加QQ群:232838885


附件:

    V1.01更新,在8位模式下自动加入 PCRE2_UTF选项,使得8位模式下可以进行中文匹配,但需要进行UTF8编码    加入示例源码
   





补充内容 (2019-9-2 11:55):
1.02更新
重新编译DLL,解决DLL无法加载的问题
更改在‘P_正则内容高级替换W’一项小小的性能问题

1.01 更新
在8位模式下编译表达式自动加入PCRE2_UTF选项,使得可以在8位模式下匹配中文(但需要UTF8编码)

补充内容 (2019-9-2 11:57):
大伙请务必进群下载1.02版本,因为之前版本编译的DLL就算你能成功加载,用户也不能,编译的问题,帖子已经不能编辑了,所以进群下载吧

补充内容 (2019-9-3 14:03):
最新更新源码请看置顶回复
作者: xhwsd    时间: 2019-8-30 23:19
好,很好,非常好!
作者: 我是个帅哥    时间: 2019-8-30 23:20
谢谢大佬分享
作者: Onsxsen    时间: 2019-8-30 23:45
做的不错哦,楼主加油,期待更好的作品!
作者: Nice回忆    时间: 2019-8-30 23:49
        支持开源~!感谢分享
作者: 安哥    时间: 2019-8-31 00:46
666666666666

作者: ノ朽默℡    时间: 2019-8-31 02:09
顶楼主啦..希望楼主多发精品好帖啦.....
作者: 不苦小和尚    时间: 2019-8-31 06:48
试试看效率如何,虽然平时不太用到

作者: 悟心猎手    时间: 2019-8-31 08:16
支持开源~!感谢分享
作者: 风中冰雨    时间: 2019-8-31 08:18
看看。。。。。

作者: heize    时间: 2019-8-31 08:20
看起来不错,感谢分享

作者: 一尘不染    时间: 2019-8-31 08:24
能用上的希望给个好评,封装很累扩展功能也很累
作者: q951681306    时间: 2019-8-31 08:40
支持开源~!感谢分享
作者: wuqingg    时间: 2019-8-31 08:44
支持开源~!感谢分享

作者: xslyhk    时间: 2019-8-31 09:02
谢谢分享哦
作者: jhai    时间: 2019-8-31 09:43
老规矩,先回后下!!!!!!!

作者: (ΘζΘ)    时间: 2019-8-31 11:48
不知道有没有大佬横向对比下速度。
作者: fyh505099    时间: 2019-8-31 11:58
楼主辛苦了 支持一下

作者: 汉族    时间: 2019-8-31 12:33
来支持以下是   
作者: 外星星人    时间: 2019-8-31 12:58
支持开源~!感谢分享
作者: 韦贝贝    时间: 2019-8-31 12:58
        支持开源~!感谢分享
作者: 狸楚殇    时间: 2019-8-31 13:34
感谢分享!

作者: 醉酒成梦°    时间: 2019-8-31 14:48
感谢分享
作者: NeStedww    时间: 2019-8-31 15:14
啦啦啦啦啦啦,感谢分享

作者: 一剑磨十年    时间: 2019-8-31 15:30
感谢开源~~~
作者: 爱的愤愤    时间: 2019-8-31 15:33
楼主辛苦了,谢谢楼主,感谢楼主分享,楼主好人一生平安!!!
作者: kentfung    时间: 2019-8-31 16:37
感谢分享,下载来看看
作者: yxl2008    时间: 2019-8-31 16:42
谢谢楼主分享,下载学习!
作者: 小白熊    时间: 2019-8-31 17:01
V1.01版本以更新,并且加入示例
作者: woshipqj    时间: 2019-8-31 18:12
666666666666666666
作者: bustvr    时间: 2019-8-31 19:41
谢谢分享!下来看看
作者: ffsfdsa    时间: 2019-8-31 21:12
支持一下!感谢分享!
作者: yt0814    时间: 2019-8-31 22:04
基于PCRE2的正则表达式模块 支持Un

作者: 65426548    时间: 2019-9-1 01:04
看看修一下

作者: 不苦小和尚    时间: 2019-9-1 06:52
不错不错,再来支持一下
作者: t27950686    时间: 2019-9-1 22:35
不错不错,再来支持一下
作者: yinliming8    时间: 2019-9-1 22:47
看起来不错呢。
作者: 在线学习    时间: 2019-9-1 23:17
不错不错,真心再来支持一下!

作者: 349221466    时间: 2019-9-2 02:04
牛逼啊啊啊啊啊啊啊啊

作者: 真冬    时间: 2019-9-2 09:16
下载用用看
作者: charmerxu    时间: 2019-9-2 10:38
好东西,谢谢分享


作者: jhaa888888    时间: 2019-9-2 10:52
先下载收藏了一下
作者: charmerxu    时间: 2019-9-2 10:59
运行 试例,好像没法正常使用正则
以下是运行结果:

* 编译表达式错误:;错误开始位置:0
* 编译表达式错误:;错误开始位置:0
* 编译表达式错误:;错误开始位置:0
* 编译表达式错误:;错误开始位置:0
* 未搜索到文本
作者: charmerxu    时间: 2019-9-2 10:59
运行 试例,好像没法正常使用正则
以下是运行结果:

* 编译表达式错误:;错误开始位置:0
* 编译表达式错误:;错误开始位置:0
* 编译表达式错误:;错误开始位置:0
* 编译表达式错误:;错误开始位置:0
* 未搜索到文本
作者: 北极星光    时间: 2019-9-2 17:23
先下载收藏了一下
作者: E鼎设计    时间: 2019-9-3 08:20
正则表达式一直不会用,郁闷,
作者: mozi123    时间: 2019-9-3 10:38
        支持开源~!感谢分享
作者: hslhsl2015    时间: 2019-9-3 12:27
支持啊,666
作者: 小白熊    时间: 2019-9-3 14:02
1.04更新
新增 ‘P_正则取匹配文本位置’‘P_正则取子匹配文本位置’用于获取匹配文本在原文中的位置

1.03更新
修改1.01的更新,改为可以选择是否加入UTF选项,这使得如果你不需要在表达式匹配中文的话,你便不需要进行UTF编码
当然如果你需要匹配中文,你必须指定视为UTF字符串,并且进行编码

1.02更新
重新编译DLL,解决DLL无法加载的问题
更改在‘P_正则内容高级替换W’一项小小的性能问题

1.01 更新
在8位模式下编译表达式自动加入PCRE2_UTF选项,使得可以在8位模式下匹配中文(但需要UTF8编码)

附件
epcre2 V1.04.zip (743.02 KB, 下载次数: 240)


作者: 静默安装    时间: 2019-9-3 17:42
谢谢分享,辛苦了

作者: 情雅    时间: 2019-9-3 19:21
谢谢楼主分享
作者: 120239197a    时间: 2019-9-3 20:31
这份好,看看哈

作者: umc    时间: 2019-9-3 21:24
支持楼主,看看这个正则多强大
作者: llxx123    时间: 2019-9-3 23:08
谢谢楼主分享

作者: benxin1225    时间: 2019-9-4 07:04
33333333333

作者: 噢噢    时间: 2019-9-4 20:01
支持开源~!感谢分享
作者: 200539025    时间: 2019-9-5 02:37
水电费水电费

作者: 菜菜瓜    时间: 2019-9-5 09:53
支持开源~!感谢分享
作者: wsry    时间: 2019-9-5 19:06
很不错,辛苦了。
作者: pyms    时间: 2019-9-6 16:05
支持开源~!感谢分享
作者: 冰棍好烫啊    时间: 2019-9-6 16:57
好                    


作者: 心智帅哥    时间: 2019-9-6 21:07
支持开源~!感谢分享
作者: 云不器    时间: 2019-9-6 22:13
        支持开源~!感谢分享
作者: louxu163    时间: 2019-9-10 15:42
学习了。。。。。。。。。。。。。。。。。。。。。
作者: hu2017    时间: 2019-9-12 22:36
谢谢分享
作者: poce    时间: 2019-9-17 16:05
支持开源~!感谢分享
作者: mozi123    时间: 2019-9-24 11:26
精易的表达式课程只有常用
作者: 忧郁之子    时间: 2019-10-12 17:08
好东西,支持了。
作者: 56766876    时间: 2019-10-15 15:27
好东西,支持了。
作者: 不苦小和尚    时间: 2019-11-4 18:47
好东西,原来楼主一直在更新,
作者: hrb011011    时间: 2019-11-10 13:24
好东西,支持了!
作者: 杨明煜    时间: 2019-11-13 16:47
赞.......................
作者: yy243145965    时间: 2019-12-5 20:30
这可是个好东西,果断拿下!
作者: 一点看客    时间: 2020-3-2 22:05
还好吧!!!!!!!!!!
作者: 646hjhj    时间: 2020-4-9 21:17
感谢楼主分享,支持一下!
作者: lxinguo0    时间: 2020-6-5 03:14
支持开源~!感谢分享
作者: bordex    时间: 2020-7-26 14:17
感谢,正要用
作者: futrueface    时间: 2020-8-20 13:17
谢谢你的开源精神。下载了。
作者: 点点丶滴滴    时间: 2021-3-1 01:27
瞅瞅看
作者: 山川    时间: 2021-5-3 15:35
楼主nb,想问下这个和精易的正则比起来 有啥优势
作者: Wm邪少    时间: 2021-12-2 16:21
大佬,你还在吗?在的话更新一下吧
作者: 倌人安好    时间: 2021-12-7 22:32
山川 发表于 2021-5-3 15:35
楼主nb,想问下这个和精易的正则比起来 有啥优势

真是不懂当笑话啊, 这玩意效率不比对象快?
作者: aiky123    时间: 2022-10-11 10:23
这个函数有问题: P_取文本长度_UTF16_字符数量 (内容文本)
它取文本长度应该是找到{0,0}就结束,如果是 “开” 字开头的新行{10,0,0,95}它只返回换行符前面的字符数。
作者: 283688410    时间: 2023-1-28 21:34
谢谢分享
作者: wanglingxing1    时间: 2023-8-11 21:36
,希望考虑下 很好的模块。 感谢
作者: aismy    时间: 2024-4-8 07:19
' 替换结果U = P_正则内容替换W (表达式句柄, 编码_Ansi到Utf8 (“123”), 编码_Ansi到Utf8 (“A”), , )  ' 一个字节正常
替换结果U = P_正则内容替换W (表达式句柄, 编码_Ansi到Utf8 (“123”), 编码_Ansi到Utf8 (“AA”), , )  ' 2个就不正常了

' 替换结果U = P_正则内容高级替换W (表达式句柄, 编码_Ansi到Utf8 (“123”), 编码_Ansi到Utf8 (“正常”), , , , )  ' 正常

不知道是不是我用法错误,请作者指点,谢谢!

详细图文说明:https://125.confly.eu.org/thread-14817358-1-1.html




作者: 小白熊    时间: 2024-4-8 16:07
aismy 发表于 2024-4-8 07:19
' 替换结果U = P_正则内容替换W (表达式句柄, 编码_Ansi到Utf8 (“123”), 编码_Ansi到Utf8 (“A”), , )  ...



此模块已经不更新了哦,待有缘人弄更好的,嘿嘿

你说的这个问题我刚刚看了下,是图片箭头指的那个`P_取变量数据指针`这个函数的问题,你换成和上面一样的`P_取字节集变量数据指针`即可

至于你在问题帖子里面询问的人家的回答,其实并不会内存分配少的,因为替换时并不知道要被替换多少次,所以无法得知具体应该分配多少内存,但是在得到内存不足的错误后即可得知需要多少内存。

感谢使用!!么么哒

作者: 770345278    时间: 2024-4-22 05:34
        支持开源~!感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4