Android editText手机号正则 手机号正则式_正则数字和小数点


作者:SanKo

正则表达式原本是计算机科学里的术语,后来引入到程序语言中,在工程上也广泛应用。不过,对于大部分读者来说,即使我们不写程序、不做计算机技术相关工作,依然可以在生活、工作中尝试使用正则表达式。许多时候,若是使用正则表达式来完成,往往可以事半功倍。

它让 VSCode 的「查找」「替换」如虎添翼

我们在日常生活或者工作中,总是会碰到需要「批量处理文本」的时候。昨天我朋友在烦恼工作上的一件小事情。她需要处理数百个手机号,每行一个,需要在每个手机号的前后分别加上一个双引号。


13100002222
13100003333
13100004444
13100005555
13312345678
13987654321


最终变成:


"13100002222"
"13100003333"
"13100004444"
"13100005555"
"13312345678"
"13987654321"


也许你会选择手动一行一行敲入引号 ",亦或会动用 Excel 中强大的公式。然而,使用 Visual Studio Code、Sublime Text 等支持正则表达式替换的文本编辑器,这完全是小菜一碟。

在 VSCode 中,首先使用 option+command+F(macOS) 或者 Ctrl+H (Windows)打开「查找替换」栏。在第一行「查找」框中输入 d+,在第二行「替换」框中输入 "$0",最后点击「替换全部」按钮(在「替换」框右侧的第二个按钮),所有操作就都完成了。


Android editText手机号正则 手机号正则式_正则数字和小数点_02


在 Sublime Text 中也是同样的操作。


Android editText手机号正则 手机号正则式_手机号正则表达式验证_03


当然了,为了使用正则表达式的匹配模式,需要在 VSCode 和 Sublime Text 中查找时点亮「.*」的标记。这个按钮在 VSCode 查找框内的最右侧,在 Sublime Text 查找栏的左上角。

现在可以来稍微解释一下这里用到的两个表达式了。

在「查找」框中,我们填入的是 d+,意思是「一个或更多的数字」。正则表达式中,d 表示「数字」,而 + 表示「一个或更多」。


Android editText手机号正则 手机号正则式_手机号正则表达式验证_04


在「替换」框中,我们填入的是 "$0",很好理解,就是在前面查找出来的每一个结果两侧加上 " 双引号。这里,$0 可以用来「引用」整个匹配到的结果。


Android editText手机号正则 手机号正则式_手机号正则表达式验证_05


当然了,替换时的 $ 符号还可以有 $1$2$3……


Android editText手机号正则 手机号正则式_正则数字和小数点_06


还是刚才的那些手机号,现在换成了稍微复杂一些的规则。查找时,输入的规则是 (d{3})(d{4})(d{4}),替换时的规则是 $1-$2-$3。最后,我们得到了:


Android editText手机号正则 手机号正则式_正则数字和小数点_07


在这个规则中,d{3} 意味着「3个数字」,d{4} 以为着「4个数字」。于是我通过 d{3}d{4}d{4} 这样一个规则,把号码分成了 3、4、4 的三段。对于匹配到的每一段,我都加上了一个括号。


Android editText手机号正则 手机号正则式_正则数字和小数点_08


于是,当我们在「替换」中输入 $1 的时候,它会从「查找」框中寻找第一个括号,并使用匹配到的第一个括号里的内容来替换 $1 的部分。至于 $2$3,便是在查找时去匹配第二、第三个括号中的内容。

它让 Everything 的搜索比快更快

Everything 是 Windows 上一款颇受好评的文件搜索工具,在 Windows 上实现了文件「即时搜索」的效果。

然而,Everything 搜索文件虽然很快,但是遇到文件名记不清的情况,就只能输入几个关键词,在搜出的一大片文件列表中逐个确认,未免有些费时。

我曾经保存了一个图片,名字就叫 apple,但是却忘记了它的文件格式。到底是 jpg 还是 png?还是 gif 或者 bmp?也可能是 jpeg 或者 webp?

直接使用 Everything 的普通模式搜索时,会出现数百个结果。


Android editText手机号正则 手机号正则式_手机号正则表达式验证_09


使用快捷键 Ctrl+R 打开「正则表达式」的开关,就可以使用正则表达式来进行匹配了。打开后,在 Everything 右下角的状态栏中会出现「正则表达式」的文字。


Android editText手机号正则 手机号正则式_正则数字和小数点_10


这样一来,搜索结果就只剩下了 4 个,寻找起来比刚才省事很多。

我在这里使用的正则表达式也并不复杂。^apple..{3,}$ 中, ^$ 分别表示文件名的起始位置和结束位置,意味着在匹配到的结果前后都不再有其他字符。. 表明一个小数点 .,也就是文件名和扩展名之间间隔的那个点。后面的 .{3,} 意味着「3 个或更多的任意字符」,匹配了扩展名中可能存在的 3 个或更多字符。


Android editText手机号正则 手机号正则式_正则数字和小数点_11


市面上也有一些其他文件搜索工具,使用了和 Everything 相似的技术原理,却鲜见对正则表达式的完备支持。然而,如果没有了正则表达式,这些文件搜索工具速度再快,也是没有灵魂的。

它让 Tasker 和快捷指令锦上添花

当你在你的 Android 手机上收到一条验证码,如何把它快速复制到你的剪贴板里呢?现在各大定制 OS 都提供了「复制验证码」的功能,但是仍需手动点击通知中的「复制」按钮。借助 Tasker 我们可以实现更加自动化的复制。

  1. 设置 PROFILE,当收到新短信时触发
  2. 检查短信中是否包含验证码
  3. 如果包含验证码,提取并复制到剪贴板
  4. 直接在对应的 APP 里面粘贴

对于其中的第二步「检查短信中是否包含验证码」,就又是正则表达式大展拳脚的地方了。


Android editText手机号正则 手机号正则式_手机号正则表达式验证_12


我这里使用了一个简单粗暴的方式来检查验证码内容:是否包含连续 4-8 个数字。正则表达式用的是 d{4,8},也就是从短信中寻找连续的 4-8 个数字,并放到剪贴板中。

iOS 上的「快捷指令」同样可以使用正则表达式进行匹配和替换。比如下图中的这个快捷指令,可以在分享知乎链接的时候,只复制最精简的的回答链接。


Android editText手机号正则 手机号正则式_正则数字和小数点_13


如果直接复制,你得到的可能是这样一大段文字:


三体中,歌者为什么那么轻易就使用二向箔? — 王东凯陪你考注会 的回答 - 知乎 https://www.zhihu.com/question/304759872/answer/1079833112?utm_source=ZHShareTargetIDMore&utm_medium=social&utm_oi=26915779903488


而借助这个快捷指令,你可以直接获得下面的链接:


https://www.zhihu.com/question/304759872/answer/1079833112


用于匹配的正则表达式是这样的:

https://www.zhihu.com/question/d+/answer/d+

它可以寻找到符合格式要求的网址,并通过后续的动作复制到剪贴板中。

总之,无论是在 Windows 和 macOS 上处理文本,还是在 Everything 中搜索文件,亦或是在手机和平板电脑上进行自动化的操作,如果一个工具可以支持正则表达式,如果你能够善用正则表达式,那它一定会给你带来许多新的可能性。