l.alpha*2
是指 l.alpha
乘以 l.P(2)
。
所以,不,这与[a-z]..
匹配不上。
查看 lpeg.print(timezone)
的输出结果来确认此内容。(请注意我使用了ll
作为区域设置数据的变量名。将其放在同一个表中会丢失原始的print
调试函数。)
> l=require"lpeg"
> ll=lpeg.locale()
> p=ll.alpha*2
> l.print(p)
[]
00: set [(41-5a)(61-7a)]-> FAIL
05: any * 2-> FAIL
06: end
> =p.match("099")
nil
> =p.match("EST")
4
> =p.match("E99")
4
你需要的模式是:
> function patcount(pat, min, max)
>> return -pat^(max + 1) * pat^min
>> end
> p=patcount(ll.alpha, 3, 3)
> lpeg.print(p)
[]
00: set [(41-5a)(61-7a)]-> 27
05: choice -> 27 (1)
06: set [(41-5a)(61-7a)]-> FAIL
11: set [(41-5a)(61-7a)]-> FAIL
16: set [(41-5a)(61-7a)]-> FAIL
21: span [(41-5a)(61-7a)]
26: failtwice
27: set [(41-5a)(61-7a)]-> FAIL
32: set [(41-5a)(61-7a)]-> FAIL
37: set [(41-5a)(61-7a)]-> FAIL
42: span [(41-5a)(61-7a)]
47: end
> =p:match("EST")
4
> return p:match("ES")
nil
> return p:match("ESTT")
nil
> return p:match("099")
nil
> return p:match("E99")
nil
相关文档位于
-patt
。
至于l.alpha*2
语法,这是由手册中的以下引用解释的。
所有需要模式作为参数的操作也可以接收字符串、表、数字、布尔值或函数,它们根据函数lpeg.P的规则转换为模式。
也就是说,当其中一个操作数已经是模式时,运算符将非模式转换为模式。
还有“匹配固定重复次数的模式”部分(和链接)在LpegRecipes lua-users.org维基页面上。(但我还没有仔细研究过那个实现,看起来比我上面的更复杂。)
return pat^min - pat^(max+1)
- wqw