定义
正则表达式(regular expression)是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式(pattern)。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
普通字符: 包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
特殊字符: 所谓特殊字符,就是一些有特殊含义的字符,简单的说就是表示任何字符串的意思。如果要查找字符串中的 *
符号,则需要对 *
进行转义,即在其前加一个 \
例如: colo\*r
匹配 colo*r。下面的表格列出了一些特殊字符:
特别字符 | 描述 |
---|---|
( ) | 标记一个子表达式的开始和结束位置。 |
* | 匹配前面的子表达式零次或多次。 |
+ | 匹配前面的子表达式一次或多次。 |
. | 可以匹配任意的单个字符、英文字母、数字,以及它本身。 例: /..g/ 可以匹配www.google.com 正则匹配:ww[.][.]g[.][.]gle.com |
[ | 标记一个中括号表达式的开始。 |
? | 匹配前面的子表达式零次或一次。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 例: ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。 |
{ | 标记限定符表达式的开始。 |
| | 指明两项之间的一个选择。 例如, /z|food/ 能匹配 “z” 或 “food”。/(z|f)ood/ 则匹配 “zood” 或 “food”。 |
\w | 用于匹配字母,数字或下划线字符 |
\W | 用于匹配所有与\w不匹配的字符 |
\d | 用于匹配从0到9的数字 |
\D | 匹配一个非数字字符。等价于 [^0-9] 。 |
\s | 用于匹配单个空格符,包括tab键和换行符 |
\S | 用于匹配除单个空格符之外的所有字符 |
限定符: 限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
字符 | 描述 |
---|---|
{n} | n 是一个非负整数。匹配确定的 n 次。 例: /o{2}/ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。{0,} 等价于 * 。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 例如, /o{1,3}/ 将匹配 “fooooood” 中的前三个 o。o{0,1} 等价于 o? 。请注意在逗号和两个数之间不能有空格。 |
定位符: 定位符用于规定匹配模式在目标对象中的出现位置。
定位符 | 描述 |
---|---|
^ | 规定匹配模式必须出现在目标字符串的开头。 例如, /^A/ 并不会匹配 “an A” 中的 ‘A’,但是会匹配 “An E” 中的 ‘A’。 |
$ | 规定匹配模式必须出现在目标对象的结尾。 例如, /ar$/ 可以与以 “car”,或“bar”等以 “ar” 结尾的字符串相匹配。 |
\b | 规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一。 例如, /\bb/ 可以与 “bomb”或 “bob”等以‘b’开头的字符串相匹配。 |
\B | 规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。 例如, /man\b/ 可以与目标对象中以 “human”或“woman”等以 “man”结尾的字符串相匹配。 |
指定范围
[A-Z]
将会与从A到Z范围内任何一个大写字母相匹配。[a-z]
将会与从a到z范围内任何一个小写字母相匹配。[0-9]
将会与从0到9范围内任何一个数字相匹配。([a-z][A-Z][0-9])+
将会与任何由字母和数字组成的字符串,如 “aB0” 等相匹配。[^xyz]
一个反向字符集。也就是说, 它匹配任何没有包含在方括号中的字符。你可以使用破折号(-)来指定一个字符范围。
组
可以用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了,你也可以对子表达式进行其它一些操作。
/(\d{1,3}\.){3}\d{1,3}/
是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}
匹配1到3位的数字,(\d{1,3}\.){3}
匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})
。(它也将匹配256.300.888.999这种不可能存在的IP地址。能匹配一个正确的IP地址的正则表达式:/((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
)