正则表达式入门(一)元字符

发表于2019-11-01,长度1965, 264个单词, 5分钟读完
Flag Counter

正则表达式,英文是Regular Expression。从英文可以看出它表达的是一种规则的格式,所以在台湾译作“正规表示式”。这篇文章整理自我在公司一年前的分享。这里简单介绍一些正则表达式的常用技术,希望读者看完能够使用其中一些技巧。

大家接触正则表达式估计是从JavaScript或者Linux的grep命令,亦或者是各种编辑器的搜索替换功能。这些都是正则的常用之处,包括各种IDE。正则的概念最早在1951年就出现了,后来Unix系统开始广泛使用,之后新诞生的Perl语言则将正则推向了辉煌。正则表达式也是在不断的发展和进化中,但是由于其语法复杂,性能又一般,现在对其作出贡献的大厂很少,基本就剩微软了。

虽然正则的缺点很致命,但是掌握一点简单的正则用法,还是能让我们事半功倍

看一个例子:如何在下面的文本中搜索“hi”

Hi welcome here
The history of it is very looong.
Please say 'hi shi' to him!
His No is 18812345678.

请打开你喜爱的编辑器跟着我一起做,比如notepad++/sublime/vs code/InteliJ IDEA等。打开搜索框(一般是Command+F),并开启正则模式(图中标红的地方):

在搜索输入hi即可完成查找。

正则按钮前面还有两个按钮,可以点击试一下它们的作用

是不是超级简单,好像和普通搜索没什么差别。 但如果我需要搜索下面的内容呢:

  • 匹配11个数字
  • 匹配以h开头的单词,包括h
  • 匹配以h开头的单词,不包括h

元字符

在继续介绍之前,我们先来看一点正则的元字符:

元字符 匹配字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
? 最多一次
* 任意次,没有也行
+ 必须有,至少一次
\ 转义

后面四个比较好记,我们很早就了解了。前面几个呢单说一下\b吧,\b表示单词的两边,单词的意思就是拉丁文的,后面如果跟了中文就认为到边界了,而数字会认为是单词的一部分。有一点要注意,连字符两边不会被视为一个单词,而是会被匹配为边界。

比如上面的问题:匹配11个连续数字,可以输入11次\d来匹配。那如果要匹配连续的一万个数字岂不是要类似。所以正则提供了次数范围元字符:

元字符 含义
{} 次数范围
() 分组
[] 里面任一

所以一万个数字可以使用\d{10000}来匹配。分组后面再讲,任一的意思是中括号里面的字符,有一个匹配就是匹配成功。比如像匹配元音字母,可以使用[aeiou]。

思考一下:^\d{5,12}$是啥意思?(?0\d{2}[)-]?\d{8}呢?

^\d{5,12}$的意思是整个字符串是5到12位的数字此外这个字符串没有任何其他内容。(?0\d{2}[)-]?\d{8}意思是以0或1个左括号开头(上面看到小括号是分组的元字符,所以要转义)后面跟0和两个数字,再跟恰好一个右括号或断线,最后是8个数字。

再思考一下:如何匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等

反义

除了上面几种元字符,正则还提供了他们的对立面:反义元字符,将其大写即可

元字符 匹配字符
\W 匹配字母或数字或下划线或汉字以外的字符
\S 匹配空白符以外的字符
\D 匹配数字以外的字符
\B 匹配不是单词的开始或结束
[^x]] 匹配除x以外的任意字符

其中最后一个反义重用了表示字符串开始的^元字符,比如[^aeiou]表示元音字母外的所有字符(注意不是5个字母都要加^)。

Written on November 1, 2019
分类: dev, 标签: re
如果你喜欢,请赞赏! davelet