您的位置:首页 > 其它

正则表达式简单用法

2016-01-24 15:31 281 查看

1. 正则语法

1.1 基本元字符

元字符含义
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意空白符 (Space Tab)
\d匹配数字
^匹配字符串的开头
$匹配字符串的结尾

1.2 重复

元字符含义
*零次或更多次
+一次或更多次
?零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

1.3 字符集合

当查找字母,数字,空白时,直接使用元字符即可。但如果要匹配特定的字符集,这时就需要
字符集合


[afox]
匹配afox中任意一个字符

[^afo]
不匹配afo中的任意一个字符

[a-c0-2]
等价于
[abc012]


1.4 分支

类似于C++中的
a || b
表达式,
a
b
任意一个为真,则表达式为真。

0\d{3}|1\d{2}
匹配以0开头的四个数字 或者 以1开头的3个数字。
|
用来表示分支操作。

1.5 分组

分组用于重复匹配。比如IP地址
192.168.4.2
, 简单的正则表达式:
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
。可见表达式中重复出现
\d{1,3}\.
,此时可以采用分组。
(\d{1,3}\.){3}\d{1,3}


说白了,就是重构。提取重复代码,构造一个公共函数,进行调用。

1.6 反义

不匹配特定字符。

元字符含义
\W匹配任意不是字母,数字,下划线,汉字的字符
\S匹配任意非空白字符
\D匹配任意非数字的字符
\B匹配任意不是单词开头或结束的位置
[^a]匹配除a以外的任意字符

1.7 后向引用

后向引用: 正则表达式前面匹配一个字符串,在表示的后面部分进一步处理。表达式前面的匹配称为捕获,使用小括号。

the the
---------------------------------------
grep -P "\b(\w+)\b\s+\1\b" --color text
the the


捕获:
()
通过添加小括号,对数据进行捕获。

引用:
\1
引用捕获的内容, 1表示第一个小括号捕获的内容,如果有多个捕获,从左到右依次编号。

1.8 零宽断言

用于查找某些内容(但不包含这些内容)之前或者之后的内容。比如
singing
, 匹配ing之前的内容sing。

表达式含义
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
singing
singingd
-------------------------------------
grep -P "\b\w+(?=ing\b)" --color text
singing


1.9 贪婪与懒惰

正则表达式很勤快,也称为贪婪,总是最长匹配。例如:
a.*b
会匹配字符串
axbxxxb
。但如果只想匹配
axb
,这时需要懒惰匹配,表达式
a.*?b


表达式含义
*?重复任意次,但尽可能少
+?重复1次或更多次,但尽可能少
??重复0次或1次,但尽可能少
{n,m}?重复n到m次,但尽可能少
{n,}?重复n次以上,但尽可能少

2. 正则历史

2.1 PCRE 与 POSIX

2.1.1 PCRE 与 POSIX 区别

正则语法 中所描述的各种使用范例,都是
PCRE
(Perl Compatible Regular Expressions)流派的使用方法。而在Unix/Linux 世界中,还存在另一流派,即
POSIX
规范。

区别

-
POSIX
不支持懒惰匹配

-
POSIX
不支持
\d
,
\D
,
\s
,
\S
,
\w
,
\W


-
POSIX
不支持零宽断言

字符组

POSIX
虽然不支持
\d
,
\s
等元字符,但其引入字符组概念。

[:digit:] 匹配数字,等同
\d


[:alpha:] 匹配字母,等同
[a-zA-z]


[:lower:] 匹配小写,等同
[a-z]


[:upper:] 匹配大写,等同
[A-Z]


[:space:] 匹配空白,等同
\s


栗子

234 匹配以数字2开头的三个数字
grep -E "2[[:digit:]]{2}" --color text

2e 匹配以数字2开头的非数字
grep -E "2[^[:digit:]]" --color text

后向引用, 匹配 the the
grep  "\b\([a-z]\+\)\b\s\+\1" --color text


NOTE: 参照http://www.greenend.org.uk/rjk/tech/regexp.html

2.1.2 BRE 与 ERE 区别

POSIX 正则,又分为
BRE
(Basic Regular Expressions 与
ERE
(Extended Regular Expressions)两个流派。

BRE
元字符
?
+
{
|
(
)
丢失特殊含义,成为普通字符。使用其特殊含义,需要
\
进行转义,即
\?
\+
\{
|
\(
\)


BRE
不支持分支。

NOTE: Grep 有4个参数,-G 代表BRE,-E 代表ERE, -F 代表PCRE, -F 普通文本。

2.2 VIM Magic

VIM Magic 设计初衷:更容易的构造正则表达式。支持pcre的元字符
\d
\s
\w
等。但却没有给
+
()
{}
赋予特殊含义。这样
Vim Magic
模式既有
PCRE
语法,又有
POSIX
语法,导致字符转义规则比较混乱。

\v
除下划线, 大小写字母,数字外,全为特殊字符

\V
只有
\
有特殊含义

case
---------------------
2x23
2x7{2}
2.7{2}

Magic 模式
---------------------
2.\d{2}$  匹配 2x7{2}

\v 模式
---------------------
2.\d{2}$  匹配 2x23

\V 模式
---------------------
2.\d{2}$  匹配 2.7{2}


NOTE:

① 使用vim时,显示使用
v
V
, 避免magic模式的模糊不清。

② vim 中,单词界定符为
\<
,
\>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息