找回密码
 加入
搜索
查看: 2168|回复: 5

[网络通信] 正则如何获取捕获组的数量?[已解决]

[复制链接]
发表于 2018-8-19 11:03:53 | 显示全部楼层 |阅读模式
本帖最后由 cashiba 于 2018-8-19 15:00 编辑
要找出捕获变量数字和圆括号间的对应关系,不管括号嵌套多复杂,也只需要从左起依次数左括号的序数即可。“数左括号”法则适用于所有正则表达式,即便是多选结构中的括号也不例外。

$str='ftp://ftp.uu.net/pub/systems'
$m='^ftp://([^/]+)((/[^/]*)+)'
$m='^((http)|(ftp)|(file)):'
$a=StringRegExp($str,$m,3)

又:
$str='(1 + 2)(1 + (1 + 2))'
$m='^\(([^()]*(\(.*\))*[^()]*)*\)\(([^()]*(\(.*\))*[^()]*)*\)$'
$a=StringRegExp($str,$m,3)

比喻上面的一些含括号嵌套的正则表达式
如何不用手工计算有效的(的数量来获取匹配的捕获组的数量?
是不是StringRegExp函数本身可以返回捕获组的数量呢
发表于 2018-8-19 12:30:03 | 显示全部楼层
StringRegExp 模式1 ,UBound(结果数组) 不就是?
 楼主| 发表于 2018-8-19 13:41:22 | 显示全部楼层
本帖最后由 cashiba 于 2018-8-19 13:57 编辑
afan 发表于 2018-8-19 12:30
StringRegExp 模式1 ,UBound(结果数组) 不就是?
$STR_REGEXPARRAYMATCH (1)-------------------第一个匹配
$STR_REGEXPARRAYFULLMATCH (2)-------------第一个匹配(含基串)
$STR_REGEXPARRAYGLOBALMATCH (3)---------全部子匹配
$STR_REGEXPARRAYGLOBALFULLMATCH (4) ---全部匹配组(含基串)

从帮助文件上的参数说明看:
模式1或2还要循环一圈才能得到所有匹配,这样的话捕获组的数量=累加循环次数?
模式4直接得到模式2的全部实例
不知道以上理解对不对.......

A大说的是应该是模式4吧?UBound(模式4结果数组)=捕获组的数量?

主要是因为模式4数组嵌套可能比较占用资源,所以平时模式3用得比较多,但是模式3好像不能直接获得捕获组数,@Extended在这里 = 错误正则表达式的偏移量,不懂...
发表于 2018-8-19 13:58:52 | 显示全部楼层
cashiba 发表于 2018-8-19 13:41
从帮助文件上的参数说明看:
模式1或2还要循环一圈才能得到所有匹配,这样的话捕获组的数量=累加循环 ...

模式3 是捕获字符串中全部的组,模式1 是仅捕获一次表达式中的所有组。你如果是通过表达式查看组的数量当然就是模式1
 楼主| 发表于 2018-8-19 15:00:21 | 显示全部楼层
afan 发表于 2018-8-19 13:58
模式3 是捕获字符串中全部的组,模式1 是仅捕获一次表达式中的所有组。你如果是通过表达式查看组的数量当 ...

明白了,我把发生匹配的次数跟捕获组数量弄混了

感谢A大!
发表于 2018-8-19 23:04:32 | 显示全部楼层
一直认为正则很神秘,很考验小脑,来学学
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 14:35 , Processed in 0.261379 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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