无忧启动论坛
标题:
尝试理论分析一个正则表达式搜索出来的结果,以理解正则搜索原理
[打印本页]
作者:
likeyouli
时间:
2024-9-28 00:12
标题:
尝试理论分析一个正则表达式搜索出来的结果,以理解正则搜索原理
待搜索内容:
D:\Desktop\业务数据\财务数据\8月\所得税--(未).xls
D:\Desktop\9月份\利润表-B.xls
D:\Desktop\业务数据\财务数据\8月\所得税--(未)\你好.xls
正则表达式:.*\\([一-龢]+).*\.
求:括号内的汉字应为啥? 也就是([一-龢]+) 这个分组里搜索出来的内容
搜索原理:整个匹配(搜索出来的内容,符合正则的每部分元素搜索要求),在这个基础上,从左往右,优先使最左边的量词(如+ *)尽可能多的匹配内容,当然这是在没开启懒惰模式情况下。
这个表达式大体分为 .* \ [一-龢]+ .* . 几部分, 所以在满足每部分都能匹配的基础上,从左往右的量词都尽可能的多匹配。
第一个:第一个.*最多匹配到8月,然后是\ ,然后是 所得税,--(未)匹配.*,然后是一个点,所以这里的答案是所得税。
第二个:利润表。 第三个 你好(此时.*未匹配到任何内容,当然也符合*表示的零个或多个要求,没办法,前边汉字的+要尽可能多的匹配嘛)。
正则表达式改为:.*?\\([一-龢]+).*\. 开启了懒惰模式。
第一个: .*? 尽可能少的匹配到D:\Desktop,然后是\ ,然后是业务数据,\财务数据\8月\所得税--(未) 匹配.*,后边是点,所以答案:业务数据
第二个:因为正则表达式要求\后边必须是汉字,所以 .*? 匹配到 D:\Desktop\9月份 ,然后是\ ,然后是利润表,-B匹配.*,所以答案:利润表
第三个:业务数据
正则表达式改为:.*\\([一-龢]+).+\.
与第一个表达式很像,.*改为了.+, 答案第一个也是所得税,第二个是利润表,但第三个是你,后边的 “好” 匹配给.+了。
满纸荒唐言吧,有时候想正则表达式的搜索原理、内部搜索逻辑想的头疼,趁有点灵感,记录一下吧。发在大部分人看不到的地方,避免嘲笑。
作者:
likeyouli
时间:
2024-9-28 00:12
本帖最后由 likeyouli 于 2024-9-28 00:28 编辑
一楼说的是一种情况,其实还有另一种情况,匹配的时候不用考虑整体匹配(即正则表达式的每部分都匹配上), 只需从左往右尽可能的匹配就行,后边的无论匹配上与否都不用管。(正则还有一个原则,已匹配的内容后边表达式不再匹配,也就是后边的元素只能从待搜索字符串中未匹配的内容中搜索匹配) 如:\S+省|\S+自治区|\S+自治州|\S+?市(?![乡村镇])|\S+[^社]区|\S+县|\S+乡|\S+镇|\S+街道|\S+村|\S+社区
如待搜索内容:
江苏省南京市建邺区双闸街道新月社区
内蒙古自治区通辽市科尔沁区五湖社区
云南省德宏傣族景颇族自治州芒市芒市镇李莹社区
可以完美地提取出地域名字。
作者:
likeyouli
时间:
2024-9-28 00:12
占楼备用
欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/)
Powered by Discuz! X3.3