开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 17997|回复: 95
收起左侧

[易语言软件开源] 【原创】epcre2:基于PCRE2的正则表达式模块 支持Unicode

[复制链接]
结帖率:95% (59/62)
发表于 2019-8-30 22:39:13 | 显示全部楼层 |阅读模式   安徽省合肥市
分享源码
界面截图:
是否带模块: -
备注说明: -
本帖最后由 小白熊 于 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位代码单元支持,模块也支持,根据需求使用选择库。


模块公开的函数和类:
M5_K2Q``)`(SJWKJ)YLJE9Y.png
使用说明:
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编码    加入示例源码
   

epcre2 V1.01.zip (795.76 KB, 下载次数: 125)

点评

已解决下面的问题   安徽省合肥市  发表于 2019-8-31 16:41
当然8位模式下其实也是可以支持中文的,但是需要将匹配文本进行UTF8编码,然后还需要改一下,在编译表达式的时候加入 PCRE2_UTF选项即可,目前我正在考虑是否要加入这个选项来解决这个问题以更加使用方便   安徽省合肥市  发表于 2019-8-31 16:14
注意:在8位模式下无法匹配中文,例如 [\u4e00-\u9fa5] 这个表达式在8位模式下无法编译成功,请使用16为模式,并使用W的函数   安徽省合肥市  发表于 2019-8-31 16:13
不好意思。 开源没注意   广东省惠州市  发表于 2019-8-31 15:14
p开头手真的很累,希望考虑下 很好的模块。 感谢   广东省惠州市  发表于 2019-8-31 15:13
能用上的希望给个好评,封装很累扩展功能也很累   安徽省合肥市  发表于 2019-8-30 23:12

评分

参与人数 10好评 +8 精币 +24 收起 理由
aismy + 1 + 2 关注新版
aiky123 + 1 YYDS~!
倌人安好 + 1 + 2 支持开源~!感谢分享
易语言资源网 + 1 + 5 支持开源~!感谢分享
醉酒成梦° + 1 + 2 支持开源~!感谢分享
汉族 + 1 + 2 建议;楼主多整一点表达式呗,以前看精易的表达式课程只有常用
fyh505099 + 1 + 1 支持开源~!感谢分享
勾栏听曲 + 1 + 2 感谢分享,很给力!~
冰点 + 1 + 5 支持开源~!感谢分享
我是个帅哥 + 2 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

结帖率:95% (59/62)

签到天数: 17 天

 楼主| 发表于 2019-9-3 14:02:41 | 显示全部楼层   安徽省合肥市
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, 下载次数: 204)
回复 支持 1 反对 0

使用道具 举报

签到天数: 5 天

发表于 2024-4-22 05:34:45 | 显示全部楼层   福建省福州市
        支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:95% (59/62)

签到天数: 17 天

 楼主| 发表于 2024-4-8 16:07:48 | 显示全部楼层   安徽省合肥市
aismy 发表于 2024-4-8 07:19
' 替换结果U = P_正则内容替换W (表达式句柄, 编码_Ansi到Utf8 (“123”), 编码_Ansi到Utf8 (“A”), , )  ...

iShot_2024-04-08_16.03.10.png

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

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

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

感谢使用!!么么哒

评分

参与人数 1好评 +1 精币 +2 收起 理由
aismy + 1 + 2 谢谢老师,正常了

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:100% (503/505)

签到天数: 25 天

发表于 2024-4-8 07:19:26 | 显示全部楼层   重庆市重庆市
' 替换结果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://bbs.125.la/thread-14817358-1-1.html



回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2023-8-11 21:36:03 | 显示全部楼层   新疆维吾尔自治区巴音郭楞蒙古自治州
,希望考虑下 很好的模块。 感谢
回复 支持 反对

使用道具 举报

签到天数: 28 天

发表于 2023-1-28 21:34:51 | 显示全部楼层   广东省阳江市
谢谢分享
回复 支持 反对

使用道具 举报

签到天数: 25 天

发表于 2022-10-11 10:23:06 | 显示全部楼层   重庆市重庆市
这个函数有问题: P_取文本长度_UTF16_字符数量 (内容文本)
它取文本长度应该是找到{0,0}就结束,如果是 “开” 字开头的新行{10,0,0,95}它只返回换行符前面的字符数。
回复 支持 反对

使用道具 举报

结帖率:76% (25/33)

签到天数: 2 天

发表于 2021-12-7 22:32:59 | 显示全部楼层   江西省赣州市
山川 发表于 2021-5-3 15:35
楼主nb,想问下这个和精易的正则比起来 有啥优势

真是不懂当笑话啊, 这玩意效率不比对象快?

评分

参与人数 1精币 +2 收起 理由
山川 + 2 很赞同,谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:100% (4/4)
发表于 2021-12-2 16:21:24 | 显示全部楼层   山西省太原市
大佬,你还在吗?在的话更新一下吧
回复 支持 反对

使用道具 举报

结帖率:71% (5/7)

签到天数: 16 天

发表于 2021-5-3 15:35:24 | 显示全部楼层   美国
楼主nb,想问下这个和精易的正则比起来 有啥优势
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 2021-3-1 01:27:11 | 显示全部楼层   浙江省绍兴市
瞅瞅看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表