正则表达式

Mar 11, 2016


常规的正则表达式

正则表达式(Regular Expression)通常用于字符串的匹配问题,关于其作用性这里不再做赘述,本文主要讲解其基本语法和范例。

正则表达式的符号

正则表达式主要分为普通字符和元字符(meta characters),其中元字符具有特殊的含义,如果在使用时要去除元字符的特殊意义,则需要转义。

  • \ 转义字符,能够去除特殊字符的含义,比如\\就相当于\
  • . 匹配除了\r\n之外的任何字符
  • * 匹配前面的子表达式>=0
  • + 匹配前面的子表达式>=1
  • ? 匹配前面的子表达式零次或一次,当该符号跟在*,+,?,{n},{n,},{n,m}时,会尽可能少的匹配所搜索的字符串。比如aaaa,a+?匹配单个a,而a+将匹配所有a
  • {n} 匹配前面的子表达式n次,{n,} 匹配至少n次,{n,m}匹配nm
  • ^ 从输入字符串的开始位置进行匹配
  • $ 从输入字符串的结束位置进行匹配
  • x|y 匹配x或者y
  • [xyz] 匹配其中任意一个字符
  • [^xyz] 匹配xyz之外的任意字符
  • [a-z] 匹配az之内的任意字符
  • [^a-z] 匹配az之外的任意字符
  • \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,}

regex chinese

范例二:匹URL链接[a-zA-z]+://\S*(/|\w)

regex url

范例三:匹配所有的hrefsrc链接 (?<=href=(?:"|')|src=(?:"|'))[^\s'"]*

regex href

Linux下的正则表达式

各类环境对正则表达式语法的支持情况如下图,来源:正则表达式之道

regex support

Linux下中主要在各类命令中使用到正则表达式,分为POSIX(Portable Operating System Interfac for Unix)定义的基本正则表达式(BRE)和扩展正则表达式(ERE)。下面引用 Linux/Unix工具与正则表达式的POSIX规范 来展示它们的异同,和对应的工具。

POSIX kind

POSIX usage

Java下正则表达式

Java下正则表达式在使用时,其实要记住需要对\进行一次额外的转义,其它基本类似。比如\S需要写成\\S,因为\在Java和正则中都为转义字符,\\S相当于先转换成了\S,然后在按照正则的规则去匹配。


上一篇博客:Linux命令之sed与awk
下一篇博客:Linux命令大全 Part One