大家好,我是公众号3分钟学堂的郭立员~
这是一篇关于正则匹配的教程,但是只针对手机号、邮箱这类的提取,并且会把它们封装成函数,可以方便使用。
先来举个例子,我写一句话:"我的手机号:",然后想要里面的手机号码,该怎么弄呢?看看下面的代码:
Import ";
Dim str="我的手机号:"
Dim arr=(str,"%d+")
TracePrint arr(0)
这是一个正则匹配数字的例子,正则表达式是%d+,这个表达式由2个部分组成%d和+
%d:代表数字(1个)
+:粗浅的理解是个“数量词”,代表多个
%d+是两者结合在一起,意思是匹配多个数字在一起的组合,需要注意+是在%d后面哦,和我们说话的语法顺序是不太一样的。
接着讲例子,如果把那句话变得复杂点又会怎样?
"我有1张手机卡,号码是"
内容稍微改变了一下,看看刚刚的代码是否还能提取。
好神奇,提取的数字不再是手机号码,而是数字1,号码去哪了,改一下代码:
原来手机号码在数组下标为1的里面,这说明正则匹配结果是把所有符合表达式的结果都匹配出来,然后存入到数组中,如果匹配的表达式足够精准,只有一个符合要求的结果,那么结果的数组下标就是0。
还拿手机号码为例,怎么才能匹配的足够精准,手机号码的特点是连续的11位数字,那么就写11个%d
Import ";
Dim str="我有1张手机卡,号码是"
Dim arr=(str,"%d%d%d%d%d%d%d%d%d%d%d")
TracePrint arr(0)
这样一来,匹配结果只有手机号了,可能有人会说连着写11个%d太麻烦了,有没有简写的方法,我的回答是没有。
我查过lua的正则匹配规则,按键正则是基于lua的,不支持类似%d{11}的写法,如果想精准匹配,就是写多个%d。
对于手机号还好说,如果是QQ号呢,它的位数不是固定的,最低有5位的,最高有10位的,那怎么匹配?
还是看个例子:"我有2个QQ号,分别是453485278和4832326"这么一句话,提取里面的QQ号码。
先用%d+把所有的数字都匹配出来:
Import ";
Dim str="我有2个QQ号,分别是453485278和4832326"
Dim arr=(str,"%d+")
For i = 0 To UBOUND(arr)
TracePrint arr(i)
Next
对于我们来说里面是有不想要的结果,所以要加条件判断,还记得刚刚我说的QQ号的位数范围是5-10位,那么我们把结果在这个范围之外的都去掉。
Import ";
Dim str="我有2个QQ号,分别是453485278和4832326"
Dim arr=(str,"%d+")
For i = 0 To UBOUND(arr)
If 5 <= Len(arr(i)) <= 10 Then
TracePrint arr(i)
End If
Next
为了方便后期使用,我还是把处理后的结果写入到一个数组中。
Import ";
Dim str="我有2个QQ号,分别是453485278和4832326"
Dim arr=(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,",")
进一步优化,就是封装成函数了:
Import ";
Dim str="我有2个QQ号,分别是453485278和4832326"
Dim arr=getQQ(str,5,10)
TracePrint join(arr,",")
Function getQQ(str,min,max)
Dim arr=(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
除了数字、还有其他的也可以,比如字母,如匹配邮箱等,详细正则可以查看这篇文章:
《提取你想要的内容(正则匹配的简单介绍)》
好了内容就这些,觉得还行帮忙给文章点个赞。
=正文完=