常规的正则表达式
正则表达式(Regular Expression)通常用于字符串的匹配问题,关于其作用性这里不再做赘述,本文主要讲解其基本语法和范例。
正则表达式的符号
正则表达式主要分为普通字符和元字符(meta characters),其中元字符具有特殊的含义,如果在使用时要去除元字符的特殊意义,则需要转义。
\
转义字符,能够去除特殊字符的含义,比如\\
就相当于\
.
匹配除了\r
或\n
之外的任何字符*
匹配前面的子表达式>=0
次+
匹配前面的子表达式>=1
次?
匹配前面的子表达式零次或一次,当该符号跟在*,+,?,{n},{n,},{n,m}
时,会尽可能少的匹配所搜索的字符串。比如aaaa
,a+?
匹配单个a
,而a+
将匹配所有a
{n}
匹配前面的子表达式n
次,{n,}
匹配至少n
次,{n,m}
匹配n
到m
次^
从输入字符串的开始位置进行匹配$
从输入字符串的结束位置进行匹配x|y
匹配x
或者y
[xyz]
匹配其中任意一个字符[^xyz]
匹配xyz
之外的任意字符[a-z]
匹配a
到z
之内的任意字符[^a-z]
匹配a
到z
之外的任意字符\b
匹配字边界,即字与空格间的位置\B
与\b
相反,匹配非字边界,比如test\B
匹配mytestb
中的test
,而非testb
中的test
\d
匹配数字字符\D
匹配非数字字符\n
匹配换行符\r
匹配回车符\t
匹配制表符\s
匹配任何空白字符,与[\f\n\r\t\v]等价\S
匹配任何非空白字符\w
匹配任何字类字符,以及下划线,等价于[A-Za-z0-9_]\W
与任何非单词字符匹配< >
匹配词的开始与结束,比如<monster>
匹配monster hunter
中的monster
,但不匹配monsterhunter
(pattern)
匹配pattern并获取这一匹配结果(?:pattern)
匹配但不获取匹配结果(?=pattern)
正向预检查,举个例子来说windows (?=xp|7|8|10)
匹配windows 10
中的windows
,但不匹配windows 95
中的windows
,也就是pattern
是作为一个匹配的条件存在,且不出现在匹配结果中(?!pattern)
反向预查,也就是windows (?!xp|7|8|10)
能匹配windows 95
中的windows
,而非windows xp
中的windows
(?<=pattern)
和(?=pattern)
方向相反,比如(?=hre)f
匹配href
的结果是f
正则表达式范例
测试用的是一个在线正则表达式测试工具:oschina regex tool和Mac上的工具RegExRx
测试文本是一段html内的head代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head>
<title>在线正则表达式测试</title>
<meta name="keywords" content="开源中国 在线工具,ostools,jsbin,加密/解密,Markdown,less,java api,php api,node.js api,QR Code"/>
<link rel="stylesheet" href="/css/basic.css?20120912" type="text/css"/>
<script type="text/javascript" src='/js/jquery/jquery-1.7.2.js'></script>
<script type="text/javascript" src='/js/jquery/jquery.cookies.2.2.0.min.js'></script>
<link rel="stylesheet" href='/js/bootstrap/css/bootstrap.min.css'/>
<script src='/js/bootstrap/js/bootstrap.min.js'></script>
</head>
范例一:匹配中文词组[\u4e00-\u9fa5]{1,}
范例二:匹URL链接[a-zA-z]+://\S*(/|\w)
范例三:匹配所有的href
和src
链接 (?<=href=(?:"|')|src=(?:"|'))[^\s'"]*
Linux下的正则表达式
各类环境对正则表达式语法的支持情况如下图,来源:正则表达式之道
Linux下中主要在各类命令中使用到正则表达式,分为POSIX(Portable Operating System Interfac for Unix)定义的基本正则表达式(BRE)和扩展正则表达式(ERE)。下面引用 Linux/Unix工具与正则表达式的POSIX规范 来展示它们的异同,和对应的工具。
Java下正则表达式
Java下正则表达式在使用时,其实要记住需要对\
进行一次额外的转义,其它基本类似。比如\S
需要写成\\S
,因为\
在Java和正则中都为转义字符,\\S
相当于先转换成了\S
,然后在按照正则的规则去匹配。