博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式简要学习
阅读量:4089 次
发布时间:2019-05-25

本文共 2789 字,大约阅读时间需要 9 分钟。

综合了Ben Forta《正则表达式必知必会》以及http://www.runoob.com中的一些正则表达式教程,特别是

http://www.runoob.com/regexp/regexp-tutorial.html

正则表达式是一些用来匹配和处理文本的字符串。正则表达式由普通字符和元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。在这里,我们认为,只要不是大小写字母和数字,都认为它是元字符。注意,正则表达式是区分大小写的。这里只介绍一些常用的正则表达式。正则表达式要通过例子来理解。

一、正则表达式的优先级

在正式了解正则表达式的语法前,我们有必要先了解一下正则表达式的优先级。否则,当面对一个很长的正则表达式的时候,我们就没办法读懂了。正则表达式的优先级如下:

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符。他们都是对在自身左边的字符做限定
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作
字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

二、最基础的正则表达式

虽然正则表达式很复杂,但是其实有一些最基础的写法。正则难理解因为里面有一个等价的概念,这个概念大大增加了理解难度。例如,?等价于匹配长度{0,1}、*等价于匹配长度{0,} 、+等价于匹配长度{1,}、\d等价于[0-9]等。这里,我们先看看最基础最基础的正则表达式。最基础的正则表达式有.、[]、^、$、?、+、*、|、()、{}、\这几个符号。下面分别对其进行分析。

1、.

一个点。它匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。

2、[]

中括号。要注意,一个中括号括住的内容表示的是满足某种条件的单个字符。如果要匹配[和],则要使用\[和\]。注意,[^]表示不包含,这个不包含并不是一个中括号和一个^的组合。在这里,可以使用-,但是在其他地方,如()和{}中,并没有这种用法。例如,[xyz]表示x或y或z,[^b-d]表示除了b,c,d外的所有字符。[\s*]表示空格或者*,而不是表示0个或多个空格。[,.!]表示逗号、句号或者感叹号。

3、^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。因为在方括号中使用时表示不包含。要匹配 ^ 字符本身,请使用 \^。

4、$

匹配输入字符串结束的位置。要匹配它,使用\?。如,^[a-zA-Z][a-zA-Z0-9_]{4,15}$表示字母开头,然后是字母数字下划线结尾,出现4到15次。

要注意理解,^和$并不跟正则表达式中的前面或者后面匹配,而只是表示,这个地方是开始位置和结束位置。如,^\d{m,n}$表示m到n位的数字,意义完全等同于\d{m,n}。

5、?

匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。要匹配它,使用\?。

6、+

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。要匹配它,使用\+。

7、*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。要匹配它,使用\*。

8、|

指明两项之间的一个选择,也就是传统上的或。要匹配 |,请使用 \|。

9、()

标记一个子表达式的开始和结束位置。()内的内容表示的是一个表达式,()本身不匹配任何东西只是把括号内的内容作为同一个表达式来处理。要匹配(和),请使用 \( 和 \)。例如,(abc|bcd|cde)表示这一段是abc、bcd、cde三者之一。()主要应用在限制多选结构的范围/分组/捕获文本/环视/特殊模式处理,这里不做叙述。

10、{}

{}是用于匹配长度的。有以下三种情况:

注意,{}里面是有可能有逗号的。逗号只有在这里能使用,并不能使用在其他地方,例如[]和()里面。它匹配的是它左边的表达式。

11、\

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。

二、元字符

元字符也分为很多类。

1、非打印字符

这里是一些常用的非打印字符,其实也就是一个\加上一个小写字母的普通字符组成,当成一个元字符。这是一些用于表示文本格式的元字符。

\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

2、一些定位符,也就是定义一个位置。要注意,对于\加上一个小写字母的普通字符组成的定位符,都有一个相反意义的\加上一个大写字母的普通字符组成的定位符。

\b 匹配一个字边界,即字与空格间的位置。
\B 非字边界匹配。

3、一些匹配字符。跟上面一样,也有一个相反的表示。

\w

匹配字母或数字或下划线或汉字,[a-z0-9A-Z]等同于\w

\s

匹配任意的空白符

\d

匹配数字

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

三、贪婪与懒惰

什么叫贪婪?正则表达式在满足整体表达式的规则下会贪婪尽可能多的匹配。例如,对于一个正则表达式q.*e,有一个字符串qweqweqwe,它会匹配到qweqweqwe,而不是匹配成qweqwe或者qwe。什么叫懒惰?满足整条表达式时尽可能少的匹配。如何从贪婪变成懒惰呢?直接在正则表达式后面加一个?即可。这是因为?表示的是出现0次或1次,这样就限定住,只能让这个表达式的匹配出现一次了。

*? :重复任意次,但尽可能少重复

+? :重复1次或多次,,但尽可能少重复

?? :重复0次或1次,但尽可能少重复

{n,}?  :重复n次以上,但尽可能少重复

{n,m}?:重复n到m次,但尽可能少重复

例如,对于字符串qweqweqwe,q.*?e匹配以q开始,以e结束最短字符,会匹配到qwe。

你可能感兴趣的文章
Leetcode 834. 树中距离之和 C++
查看>>
【机器学习】机器学习系统SysML 阅读表
查看>>
最小费用最大流 修改的dijkstra + Ford-Fulksonff算法
查看>>
最小费用流 Bellman-Ford与Dijkstra 模板
查看>>
实现高性能纠删码引擎 | 纠删码技术详解(下)
查看>>
scala(1)----windows环境下安装scala以及idea开发环境下配置scala
查看>>
zookeeper(3)---zookeeper API的简单使用(增删改查操作)
查看>>
zookeeper(4)---监听器Watcher
查看>>
zookeeper(2)---shell操作
查看>>
mapReduce(3)---入门示例WordCount
查看>>
hbase(3)---shell操作
查看>>
hbase(1)---概述
查看>>
hbase(5)---API示例
查看>>
SSM-CRUD(1)---环境搭建
查看>>
SSM-CRUD(2)---查询
查看>>
SSM-CRUD (3)---查询功能改造
查看>>
Nginx(2)---安装与启动
查看>>
springBoot(5)---整合servlet、Filter、Listener
查看>>
C++ 模板类型参数
查看>>
C++ 非类型模版参数
查看>>