李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
【转载】正则表达式--基础部分讲解(一)
Leefs
2019-12-25 AM
1415℃
0条
# 【转载】正则表达式--基础部分讲解(一) ### 前言 今天在网上看到了一篇讲述正则表达式非常好的文章,由于篇幅太长,本篇只截取了对正则表达式基础部分的讲解。 ### 一、正则表达式基础知识 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说: ```java 正则表达式:cat 匹配:cat、catalog、Catherine、sophisticated ``` #### 1.1 句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符: ```java 正则表达式:t.n 匹配:tan、Ten、tin、ton、t n、t#n、tpn等 ``` #### **1.2 方括号符号** 为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符: ```java 正则表达式:t[aeio]n 匹配:tan、Ten、tin、ton等 ``` #### **1.3 “或”符号** 如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分组,具体请参见后面介绍。 ```java 正则表达式:t(a|e|i|o|oo)n 匹配:tan、Ten、tin、ton、toon ``` #### **1.4 表示匹配次数的符号** 表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数: | 符号 | 次数 | | ----- | ----------- | | * | 0次或者多次 | | + | 1次或者多次 | | ? | 0次或者1次 | | (n) | 恰好n次 | | (n,m) | 从n次到m次 | 假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“/”。 ![正则表达式基础01.gif][1] 图一:匹配所有123-12-1234形式的社会安全号码 假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示: ![正则表达式基础02.gif][2] 图二:匹配所有123-12-1234和123121234形式的社会安全号码 下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图三显示了完整的正则表达式。 ![正则表达式基础03.gif][3] 图三:匹配典型的美国汽车牌照号码,如8836KV #### 1.5 “否”符号 `“^”`符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。 ![正则表达式基础04.gif][4] 图四:匹配所有单词,但“X”开头的除外 #### 1.6 圆括号和空白符号 假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示: ![正则表达式基础05.gif][5] 图五:匹配所有Moth DD,YYYY格式的日期 新出现的“/s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API(本文后面详细讨论)提取出它的值。修改后的正则表达式如图六所示: ![正则表达式基础06.gif][6] 图六:匹配所有Month DD,YYYY格式的日期,定义月份值为第一个组 #### **1.7 其它符号** 为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如表二所示: **表二:常用符号** | 符号 | 等价的正则表达式 | | ---- | ---------------- | | \d | [0-9] | | \D | [^0-9] | | \w | [A-Z0-9] | | \W | [^A-Z0-9] | | \s | [\t\n\r\f] | | \S | [^\t\n\r\f] | 例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“/d”。修改后的正则表达式如图七所示: ![正则表达式基础07.gif][7] 图七:匹配所有123-12-1234格式的社会安全号码 *附:[转载链接](https://www.cnblogs.com/a757956132/p/4166436.html)* [1]: https://lilinchao.com/usr/uploads/2019/12/178316414.gif [2]: https://lilinchao.com/usr/uploads/2019/12/2354115412.gif [3]: https://lilinchao.com/usr/uploads/2019/12/1412647245.gif [4]: https://lilinchao.com/usr/uploads/2019/12/775609461.gif [5]: https://lilinchao.com/usr/uploads/2019/12/2745488045.gif [6]: https://lilinchao.com/usr/uploads/2019/12/2467457911.gif [7]: https://lilinchao.com/usr/uploads/2019/12/3696273795.gif
标签:
Java
,
正则表达式
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/329.html
上一篇
正则表达式--Pattern和Matcher方法(二)
下一篇
正则表达式--组(Groups)
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
链表
Zookeeper
Java阻塞队列
Scala
Linux
Java
SQL练习题
Thymeleaf
LeetCode刷题
哈希表
Spark
队列
JavaScript
持有对象
FileBeat
Netty
DataX
Ubuntu
HDFS
Azkaban
Nacos
Filter
Tomcat
Jenkins
线程池
锁
序列化和反序列化
并发线程
Golang基础
人工智能
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞