cashiba 发表于 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函数本身可以返回捕获组的数量呢

afan 发表于 2018-8-19 12:30:03

StringRegExp 模式1 ,UBound(结果数组) 不就是?

cashiba 发表于 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在这里 = 错误正则表达式的偏移量,不懂...

afan 发表于 2018-8-19 13:58:52

cashiba 发表于 2018-8-19 13:41
从帮助文件上的参数说明看:
模式1或2还要循环一圈才能得到所有匹配,这样的话捕获组的数量=累加循环 ...

模式3 是捕获字符串中全部的组,模式1 是仅捕获一次表达式中的所有组。你如果是通过表达式查看组的数量当然就是模式1

cashiba 发表于 2018-8-19 15:00:21

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

明白了,我把发生匹配的次数跟捕获组数量弄混了
{:face (460):}
感谢A大!

顽固不化 发表于 2018-8-19 23:04:32

一直认为正则很神秘,很考验小脑,来学学
页: [1]
查看完整版本: 正则如何获取捕获组的数量?[已解决]