阅读建议,文章需要的阅读时间大概不到10分钟,但是纸上得来终觉浅,欲知此事须躬行,所以要真正入门需要做练习,练习大概需要20分钟,通过阅读和练习你就可以达到入门水平,能解决一些基础的正则问题。在这里推荐两个网站供你测试和练习: 1. 正则表达式练习平台: https://codejiaonang.com/ 2. 正则在线测试工具: http://regexr-cn.com/
现在的网路社会文本信息爆炸式增长,很多时候我们都被信息淹没,如果你想要从庞大的文字信息中提取出一小段你需要的数据,那么正则表达式或许能帮到你。
例如提取一段文本里所有的日期只需要一小段正则表达式就能完成:
正则表达式可以实现复杂的字符串匹配,查找到你需要的内容。在很多实际的应用中,需要处理的数据有千万种类型,各种复杂的字符组合方式也层出不穷,但是我们每个人对字符串处理的需求也各不相同,如果手动处理,使用if...else...
一个一个去判断会发现费事费力,而且很多时候还无法实现。
而使用正则表达式,就可以实现各种各样的需求。
你需要学习正则吗?
许多程序设计语言都支持利用正则表达式进行字符串操作,例如:JavaScript、Java、Python、Ruby、Perl等等。
所以只要你有处理字符串的需求,那这门课程就非常适合你!
入门内容目录
字符组
正则表达式强大的地方在于它可以迅速地用极简单的方式达到字符串的复杂控制。
字符组([]
)允许匹配一组可能出现的字符。
例如:
可以发现[Pp]
既可以匹配大写的P
也可以匹配小写的p
练习1
接下来,请你使用字符组匹配Java
和 java
。
入门课程的习题可以挑战到 编程胶囊网站
练习2
请你使用字符组匹配 Ruby
、Rube
、ruby
、rube
。
做题可以挑战至 编程胶囊
区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,如果依照上述代码,每次我们都需要使用[0123456789]
。
但是这样好吗?
如果要匹配从a-z
的字母呢?我想你肯定不愿意从a
写到z
了!
为了适应这一点,正则表达式引擎在字符组中使用连字符(-)
代表区间,依照这个规则,我们可以总结出三点:
- 要匹配任意数字可以使用
[0-9]
; - 如果想要匹配所有小写字母,可以写成
[a-z]
; - 想要匹配所有大写字母可以写成
[A-Z]
。
例如:
练习——匹配目标数据
接下来需要你匹配数据所有的数字、小写字母和大写字母。
可以跳转至题目链接做题。
转义符
正则表达使用了 -
号代表了区间,但是我们有时候需要匹配的符号就是 -
号,该怎么办呢?
这个时候我们需要对-
号进行转义操作,即 \-
。
在正则中使用 \
就可以进行对特殊符号进行转义,对 -
进行转义就可以表示为 \-
,即 \-
就代表了 -
号本身。
偷偷告诉你,转义符\
也适用于其他的符号,例如匹配圆括号可以使用\(
例如:
匹配特殊符号
接下来请你编写正则表达式匹配下列符号,可以直接跳转至题目:https://codejiaonang.com/#/course/regex_chapter1/0/4
。
<-
[]
-----
--
()
取反
到目前为止,我们定义的字符组都是由可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组。
例如:匹配不包含数字的字符组
可以通过在字符数组开头使用 ^
字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)。
再看一个例子:
这里的 n[^e]
的意思就是n
后面的字母不能为 e
。
接下来请你匹配爱
后面不包含你
的数据。练习题链接:https://codejiaonang.com/#/course/regex_chapter1/0/7
爱吗
爱哦
爱我自己
爱了
我爱我
请编写正则表达式,匹配不包含小写字母的数据,题目链接:https://codejiaonang.com/#/course/regex_chapter1/0/8
快捷方式
以目前学到的内容,如果想要匹配所有的字母,会使用[A-Za-z]
,要匹配数字会使用[0-9]
还有没有更简洁的方式呢?
正则表达式引擎提供了一些快捷方式如:\w
可以与任意单词字符匹配。
当我们想要匹配任意数字的时候也可以使用快捷方式\d
,d
即digit
数字的意思,等价于[0-9]
。
快捷方式 | 描述 |
---|---|
w | 与任意单词匹配 |
d | 与任意数字匹配 |
匹配单词
接下来,请你使用快捷方式匹配下面的单词。
master
code
jiaonang
123456789
987654321
0123
CODE
JIAONANG
hello world
python
匹配空白
\s
快捷方式可以匹配空白字符,比如空格,tab、换行等。
例如:
单词边界
\b
匹配的是单词的边界,例如,
\bmaster\b
就仅匹配有边界的master
单词。
当然其他类型的数据,比如数字也能匹配:
快捷方式取反
快捷方式也可以取反,例如对于\w
的取反为\W
,将小写改写成大写即可,其他快捷方式也遵循这个规则。
示例:
请使用正则表达式匹配下列开头不以字母开头的单词。
开始和结束
正则表达式中 ^
指定的是一个字符串的开始,$
指定的是一个字符串的结束。
例如:
指定字符串的结束:
请编写正则表达式匹配以OS
结尾的字符串。
任意字符
.
字符代表匹配任何单个字符,它只能出现在方括号以外。
值得注意的是: .
字符只有一个不能匹配的字符,也就是换行符(\n
),不过要让.
字符与换行符匹配也是可以的,以后会讨论。
示例:
匹配任意字母之后是ar
的字符串。
可选字符
有时,我们可能想要匹配一个单词的不同写法,比如color
和colour
,或者honor
与honour
。
这个时候我们可以使用 ?
符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
例如:
在这里 u?
表示u
是可选的,即可以出现也可以不出现,可以匹配的是 honor
和 honour
。
通过这个案例可以知道?
的作用就是匹配它之前的字符0
次或1
次。
请你思考一个问题:
.?
表达式能匹配什么呢?
请你使用正则来匹配 favorite
和favourite
这两种写法。
重复
到目前为止,我们只是学习了关于仅出现一次的字符串匹配,在实际开发中,肯定不能满足需求,比如要匹配电话号码、身份证的时候就无法满足需求了。
如果遇到这样的情况,我们可能期望一个字符组连续匹配好几次。
在一个字符组后加上{N}
就可以表示在它之前的字符组出现N
次。
例如:
重复区间
可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15
位也有18
位的。
这里重复区间就可以出场了,语法:{M,N}
,M
是下界而N
是上界。
举个例子:
\d{3,4}
既可以匹配3
个数字也可以匹配4
个数字,不过当有4
个数字的时候,优先匹配的是4
个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?
号。
开闭区间
有时候我们可能遇到字符组的重复次数没有边界,例如:
速写
还可以使用两个速写字符指定常见的重复情况,可以使用 +
匹配1
个到无数个,使用 *
代表0
个到无数个。
即:+
等价于{1,}
,*
等价于{0,}
。
+
号示例:
*
号示例:
匹配电话号码
现在请你使用正则表达式匹配手机号码,假设手机号码规则如下:
- 必须是
11
位的数字; - 第一位数字必须以
1
开头,第二位数字可以是[3,4,5,7,8]
中的任意一个,后面9
个数是[0-9]
中的任意一个数字。
18111234589
18711001111
13713201111
13712345678
14712345897
15721565489
17721565489
29711001111
30711001111
41711001111
58-1110011110
68711001111
12345678911
200110023057123
另外一些习题可以访问 :https://codejiaonang.com/
进阶课程请看下一篇:《正则表达式进阶》
)。
觉得有收获欢迎点赞评论。