无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 32|回复: 2
打印 上一主题 下一主题

尝试理论分析一个正则表达式搜索出来的结果,以理解正则搜索原理

[复制链接]
跳转到指定楼层
1#
发表于 2024-9-28 00:12:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
待搜索内容:
D:\Desktop\业务数据\财务数据\8月\所得税--(未).xls
D:\Desktop\9月份\利润表-B.xls

D:\Desktop\业务数据\财务数据\8月\所得税--(未)\你好.xls
  正则表达式:.*\\([一-龢]+).*\.
    求:括号内的汉字应为啥? 也就是([一-龢]+) 这个分组里搜索出来的内容
搜索原理:整个匹配(搜索出来的内容,符合正则的每部分元素搜索要求),在这个基础上,从左往右,优先使最左边的量词(如+ *)尽可能多的匹配内容,当然这是在没开启懒惰模式情况下。
这个表达式大体分为 .*    \   [一-龢]+    .*    . 几部分,  所以在满足每部分都能匹配的基础上,从左往右的量词都尽可能的多匹配。
第一个:第一个.*最多匹配到8月,然后是\ ,然后是 所得税,--(未)匹配.*,然后是一个点,所以这里的答案是所得税。
第二个:利润表。 第三个 你好(此时.*未匹配到任何内容,当然也符合*表示的零个或多个要求,没办法,前边汉字的+要尽可能多的匹配嘛)。

    正则表达式改为:.*?\\([一-龢]+).*\.   开启了懒惰模式。
第一个: .*? 尽可能少的匹配到D:\Desktop,然后是\ ,然后是业务数据,\财务数据\8月\所得税--(未) 匹配.*,后边是点,所以答案:业务数据
第二个:因为正则表达式要求\后边必须是汉字,所以 .*? 匹配到 D:\Desktop\9月份 ,然后是\ ,然后是利润表,-B匹配.*,所以答案:利润表
第三个:业务数据

   正则表达式改为:.*\\([一-龢]+).+\.
与第一个表达式很像,.*改为了.+,  答案第一个也是所得税,第二个是利润表,但第三个是你,后边的  “好”  匹配给.+了。

       满纸荒唐言吧,有时候想正则表达式的搜索原理、内部搜索逻辑想的头疼,趁有点灵感,记录一下吧。发在大部分人看不到的地方,避免嘲笑。


2#
 楼主| 发表于 2024-9-28 00:12:40 | 只看该作者
本帖最后由 likeyouli 于 2024-9-28 00:28 编辑

一楼说的是一种情况,其实还有另一种情况,匹配的时候不用考虑整体匹配(即正则表达式的每部分都匹配上), 只需从左往右尽可能的匹配就行,后边的无论匹配上与否都不用管。(正则还有一个原则,已匹配的内容后边表达式不再匹配,也就是后边的元素只能从待搜索字符串中未匹配的内容中搜索匹配) 如:\S+省|\S+自治区|\S+自治州|\S+?市(?![乡村镇])|\S+[^社]区|\S+县|\S+乡|\S+镇|\S+街道|\S+村|\S+社区
如待搜索内容:
江苏省南京市建邺区双闸街道新月社区
内蒙古自治区通辽市科尔沁区五湖社区
云南省德宏傣族景颇族自治州芒市芒市镇李莹社区
  可以完美地提取出地域名字。
回复

使用道具 举报

3#
 楼主| 发表于 2024-9-28 00:12:56 | 只看该作者
占楼备用
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-16 22:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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