常规的正则表达式
正则表达式(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,然后在按照正则的规则去匹配。