正则表达式有普通字符(例如字符a到z)和特殊字符(成为“元字符”)组成的文字模式。模式描述在搜索文本时匹配的一个或多个字符。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
1、普通字符
普通字符包含没有显示指定为元字符的可打印和不可打印字符,这包号所有大写和小写的字母,所有数字,所有标点符号和一些其他字符。
非打印字符
非打印字符也可以是正则表达式的一部分,非打印字符有八种,下面列出了非打印字符的转义:
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符,如\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一,否则将“c”视为普通字符c |
\f | 匹配一个换页符,等价于\0xc和\cL |
n | 匹配一个换行符,等价于 \x0a 和 \cJ |
\r | 匹配一个回车符, 等价于 \x0d 和 \cM |
\s | 匹配任何空白字符 ,包括空格,制表符,换页符。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任务非空白字符,等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符,等价于 \x09 和 \cI |
\v | 匹配一个垂直制表符,等价于 \x0b 和 \cK。 |
特殊字符
一些特定含义的字符叫作特殊字符,若要匹配这些特殊字符,必须将反斜杠字符“\”加在它们前面实现转义才能进行匹配。特殊字符有11种,下面列出特殊字符:
字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配\n或\r 。要匹配$本身请使用\$。下同 |
() | 标记一个子表达式的开始和结束位置 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
. | 匹配除换行符\n之外的任务单字符 |
[ | 标记一个方括号表达式的开始,[]使用时,只有在方括号里面指定的字符才会被匹配,只能匹配单个字符,如:[1-9]指1到9的一位数字,[a-z]指字符a到字符z中的一个字符 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符 |
\ | 将下一个字符标记为或特殊字符,或原义字符,或向后引用,或八进制转移符 |
^ | 匹配输入字符串的开始。当该符号在方括号表达式里面(既中括号[])使用时,表示不接受该方括号表达式中的字符集合,不想匹配的字符 |
{ | 标记限定符表达式的开始 |
| | 指明两项之间的一个选择 |
限定符
限定符用来指定正则表达式的一个指定组件必须要出现多少次才能满足匹配。有*,+,?,{n},{n,},{n,m}六种:
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次,例如“zo*”能匹配“z”,或“zooo” 。*等价于{0,} |
+ | 匹配前面的子表达式一次或多次,例如“zo+”能匹配“zo”,或“zooo”,但不能匹配“z”。+等价于{1,} |
? | 匹配前面的子表达式零次或一次, 例如“zo?”能匹配“z”,或“zo”,但不能匹配“zoo”。?等价于{0,1} |
{n} | n为一个非负整数,匹配确定的n次(恰好为n次)。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o |
{n,} | n为一个非负整数,至少匹配n次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o |
{n,m} | n,m均为非负整数,其中n<=m,至少匹配n次最多匹配m次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o |
下面举一些例子:
/[1-9][0-9]/
这个表达是的意思为:第一位是1到9的数字,第二位是0到9的数字;
/[0-9]{2}/
这个表达的意思为:0到9的数字刚好出现两次,既两位数,如:05,15。
/[0-9]{1,}/
这个表达的意思为: 0到9的数字至少出现一次,如:0a,1,aa则不能匹配。
/[0-9]{1,2}/
这个表达的意思为:第一位可以是0到9,且0到9后面跟的数字最少出现一次,最多出现两次。既[0-9]能出现一次或两次。如 0,02,15等。
/[1-9][0-9]?/
?表示子表达式出现零次或者一次,既[0-9]出现零次或者一次,所以这个表达式表达了1~99的整数,同时/[1-9]{0-9}?/
等于 /[1-9][0-9]{0,1}/
贪婪匹配
星号(*),点号(.),加号(+)这个三个限定符都是贪婪的,因为他们会尽可能多的匹配文字,只有在它们的后面加上问号(?)就可以实现非贪婪或者最小匹配。如:
html代码:<h1>这个是标\</h1>
如果用/<.*>/
来匹配的话,则匹配小于符号 (<) 到关闭 h1 标记的大于符号 (>) 之间的所有内容,得到的是整个标题<h1>这个是标\</h1>
;
如果是用/<.*?>/
来匹配的话,则形成最小匹配,匹配到的是:<h1>
通过在*、+ 或 ? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。