「按键精灵」直接提取多位数字,如手机号、QQ号等

大家好,我是公众号3分钟学堂的郭立员~

这是一篇关于正则匹配的教程,但是只针对手机号、邮箱这类的提取,并且会把它们封装成函数,可以方便使用。

先来举个例子,我写一句话:"我的手机号:",然后想要里面的手机号码,该怎么弄呢?看看下面的代码:

Import""Dimstr="我的手机号:"Dimarr=(str,"%d+")TracePrintarr(0)

这是一个正则匹配数字的例子,正则表达式是%d+,这个表达式由2个部分组成%d和+

%d:代表数字(1个)

+:粗浅的理解是个“数量词”,代表多个

%d+是两者结合在一起,意思是匹配多个数字在一起的组合,需要注意+是在%d后面哦,和我们说话的语法顺序是不太一样的。

接着讲例子,如果把那句话变得复杂点又会怎样?

"我有1张手机卡,号码是"

内容稍微改变了一下,看看刚刚的代码是否还能提取。

好神奇,提取的数字不再是手机号码,而是数字1,号码去哪了,改一下代码:

原来手机号码在数组下标为1的里面,这说明正则匹配结果是把所有符合表达式的结果都匹配出来,然后存入到数组中,如果匹配的表达式足够精准,只有一个符合要求的结果,那么结果的数组下标就是0。

还拿手机号码为例,怎么才能匹配的足够精准,手机号码的特点是连续的11位数字,那么就写11个%d

Import""Dimstr="我有1张手机卡,号码是"Dimarr=(str,"%d%d%d%d%d%d%d%d%d%d%d")TracePrintarr(0)

这样一来,匹配结果只有手机号了,可能有人会说连着写11个%d太麻烦了,有没有简写的方法,我的回答是没有。

我查过lua的正则匹配规则,按键正则是基于lua的,不支持类似%d{11}的写法,如果想精准匹配,就是写多个%d。

对于手机号还好说,如果是QQ号呢,它的位数不是固定的,最低有5位的,最高有10位的,那怎么匹配?

还是看个例子:"我有2个QQ号,分别是453485278和4832326"这么一句话,提取里面的QQ号码。

先用%d+把所有的数字都匹配出来:

Import""Dimstr="我有2个QQ号,分别是453485278和4832326"Dimarr=(str,"%d+")Fori=0ToUBOUND(arr)TracePrintarr(i)Next

对于我们来说里面是有不想要的结果,所以要加条件判断,还记得刚刚我说的QQ号的位数范围是5-10位,那么我们把结果在这个范围之外的都去掉。

Import""Dimstr="我有2个QQ号,分别是453485278和4832326"Dimarr=(str,"%d+")Fori=0ToUBOUND(arr)If5=Len(arr(i))=10ThenTracePrintarr(i)IfNext

为了方便后期使用,我还是把处理后的结果写入到一个数组中。

Import""Dimstr="我有2个QQ号,分别是453485278和4832326"Dimarr=(str,"%d+")Dimarrnew(),n=0Fori=0ToUBOUND(arr)If5=Len(arr(i))=10ThenTracePrintarr(i)arrnew(n)=arr(i)n=n+1IfNextTracePrintjoin(arrnew,",")

进一步优化,就是封装成函数了:

Import""Dimstr="我有2个QQ号,分别是453485278和4832326"Dimarr=getQQ(str,5,10)TracePrintjoin(arr,",")FunctiongetQQ(str,min,max)Dimarr=(str,"%d+")Dimarrnew(),n=0Fori=0ToUBOUND(arr)Ifmin=Len(arr(i))=maxThenarrnew(n)=arr(i)n=n+1IfNextgetQQ=arrnewFunction

除了数字、还有其他的也可以,比如字母,如匹配邮箱等,详细正则可以查看这篇文章:

《提取你想要的内容(正则匹配的简单介绍)》

好了内容就这些,觉得还行帮忙给文章点个赞。

=正文完=

发布于 2025-03-22
52
目录

    推荐阅读