正则表达式基础疑问:digit组合冗余性及hdigit等价规则解析
嘿,我来帮你把这两个正则相关的疑问掰扯清楚~
问题1:非空数字串的正则,为啥用
digit digit+而不是直接digit+? 首先得把两个表达式的实际匹配范围搞明白:
digit+:正则里的+表示一个或多个匹配,所以这个表达式能覆盖所有非空数字串——不管是单个数字(比如5),还是一串数字(比如1234),全都能匹配到,完全符合“非空数字串”的需求。digit digit+:这个写法是先匹配1个digit,再匹配一个或多个digit,合起来就是至少要2个digit才能匹配,只能覆盖长度≥2的数字串(比如01、999),但匹配不了单个数字(比如7)。
所以如果需求真的是“非空数字串”,那开头的那个digit确实是多余的,直接用digit+就够了。大概率是你看到的那个例子要么表述错了,要么实际需求是“至少两位的数字串”,才会用digit digit+这种写法。
问题2:为啥
hdigit+和hdigit hdigit*是等价的? 这其实是正则量词的基础逻辑,咱们拆成小块看就懂了:
hdigit*里的*表示零个或多个匹配,它可以匹配空串,也可以匹配1个、2个……任意数量的十六进制数字。hdigit hdigit*就是先强制匹配1个hdigit,再跟着匹配零个或多个hdigit——合起来看,就是“至少有1个hdigit”,前面的hdigit保证了最少1个,后面的*可以加任意数量(包括0个)。- 而
hdigit+本身就是正则里的简写量词,它的定义就是一个或多个匹配,和hdigit hdigit*的逻辑完全一模一样。
举两个实际例子你就更清楚了:
- 匹配单个十六进制数字
F:hdigit匹配F,后面的hdigit*匹配空串,符合hdigit hdigit*;同时hdigit+也直接匹配F。 - 匹配三个十六进制数字
A2C:hdigit匹配A,hdigit*匹配2C,符合hdigit hdigit*;hdigit+则直接匹配整个A2C。
说白了,hdigit+就是hdigit hdigit*的简化写法,功能完全等价。
内容的提问来源于stack exchange,提问作者bob9123
相关产品推荐
相关产品推荐

