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

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

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

Import "shanhai.lua" Dim str="我的手机号:13712345678" Dim arr=shanhai.RegexFind(str,"%d ") TracePrint arr(0)

按键精灵文本转数字(直接提取多位数字)(1)

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

%d:代表数字(1个)

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

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

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

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

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

按键精灵文本转数字(直接提取多位数字)(2)

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

按键精灵文本转数字(直接提取多位数字)(3)

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

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

Import "shanhai.lua" Dim str="我有1张手机卡,号码是13712345678" Dim arr=shanhai.RegexFind(str,"%d%d%d%d%d%d%d%d%d%d%d") TracePrint arr(0)

按键精灵文本转数字(直接提取多位数字)(4)

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

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

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

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

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

Import "shanhai.lua" Dim str="我有2个QQ号,分别是453485278和4832326" Dim arr=shanhai.RegexFind(str,"%d ") For i = 0 To UBOUND(arr) TracePrint arr(i) Next

按键精灵文本转数字(直接提取多位数字)(5)

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

Import "shanhai.lua" Dim str="我有2个QQ号,分别是453485278和4832326" Dim arr=shanhai.RegexFind(str,"%d ") For i = 0 To UBOUND(arr) If 5 <= Len(arr(i)) <= 10 Then TracePrint arr(i) End If Next

按键精灵文本转数字(直接提取多位数字)(6)

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

Import "shanhai.lua" Dim str="我有2个QQ号,分别是453485278和4832326" Dim arr=shanhai.RegexFind(str,"%d ") Dim arrnew(),n=0 For i = 0 To UBOUND(arr) If 5 <= Len(arr(i)) <= 10 Then TracePrint arr(i) arrnew(n) = arr(i) n=n 1 End If Next TracePrint join(arrnew,",")

按键精灵文本转数字(直接提取多位数字)(7)

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

Import "shanhai.lua" Dim str="我有2个QQ号,分别是453485278和4832326" Dim arr=getQQ(str,5,10) TracePrint join(arr,",") Function getQQ(str,min,max) Dim arr=shanhai.RegexFind(str,"%d ") Dim arrnew(),n=0 For i = 0 To UBOUND(arr) If min <= Len(arr(i)) <= max Then arrnew(n) = arr(i) n=n 1 End If Next getQQ=arrnew End Function

按键精灵文本转数字(直接提取多位数字)(8)

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

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

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

=正文完=