常用的元字符:
说明 | 代码 |
匹配除换行符外的任意字符 | . |
匹配数字或字母或汉字或下划线 | \w |
匹配任意的空白字符 | \s |
匹配数字 | \d |
匹配单词的开始或结束 | \b |
匹配字符串的开始 | ^ |
匹配字符串的结束 | $ |
比如匹配一个5到12位的扣扣号:^\d{5,12}$
字符串转义:
比如你要匹配\,.,*等就出现了问题,这时你就要用特殊的转义字符\来代替了
比如你使用\\就是匹配\,使用\.就是匹配.使用\*就是匹配*.例如:deerruan\.net
就是匹配deerruan.net,使用C:\\Windows就是匹配C:\Windows.
重复
代码/语法 | 说明 |
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
例如:Windows\d+ 匹配Windows一个或多个数字
^\w+ 匹配一行的地一个单词(或一个字符串的的第一个单词)
字符类
要想查找数字,字母或数字,空白是很简单的,因为已经有了对应这些字符集合的元字符,但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。
我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
下面是一个更复杂的表达式:\(?0\d{2}[) -]?\d{8}。
这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等。我们对它进行一些分析吧:首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8})。
分支条件
具体方法是用|把不同的规则分隔开。
例如:0\d{2}-d{8}|0\d{3}\d{7}匹配三位区号8位本地号码的或者4位区号7位本地号
分组
但如果想要重复多个字符又该怎么办?你可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
IP地址中每个数字都不能大于255. 经常有人问我, 01.02.03.04 这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字可以包含有前导 0 (leading zeroes).
不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。
反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
代码语法 | 说明 |
\W | 匹配任意不是字母,数字下划线没汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou以外的任意字符 |
例如:\S+匹配不包含空白符的字符串
<a[^>]+>匹配用见括号括起来的以a开头的字符串