常用元字符
元字符主要用于字符匹配
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用限定符
限定符主要用于表示重复次数
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次,等价于{0,} |
+ | 重复一次或更多次,等价于{1,} |
? | 重复零次或一次,等价于 {0, 1} |
n | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
常用反义词
反义词一般是大写的元字符
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
举例:
- ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,等价于{0,},/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,等价于{1,},/ba+/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,也就是说前一项是可选的,等价于 {0, 1},/ba?/将匹配b,ba
(x) 匹配x保存x在名为$1…$9的变量中
x|y 匹配x或y
{n} 精确匹配n次,匹配前一项恰好n次
{n,} 匹配n次以上
{n,m} 匹配n-m次,匹配前一项至少n次,但是不能超过m次
[xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符)
[^xyz] 不匹配这个集合中的任何一个字符
[\b] 匹配一个退格符
\b 匹配一个单词的边界
\B 匹配一个单词的非边界
\cX 这儿,X是一个控制符,\cM匹配Ctrl-M
\d 匹配一个字数字符,/\d/ = /[0-9]/
\D 匹配一个非字数字符,/\D/ = /[^0-9]/
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配一个空白字符,包括\n,\r,\f,\t,\v等,包括空格,制表符(Tab),换行符,中文全角空格等
\S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/
\t 匹配一个制表符
\v 匹配一个重直制表符
\w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9]
\W 匹配一个不可以组成单词的字符,如[\W]匹配" 5.98 " 中 的 5.98"中的 5.98"中的,等于[^a-zA-Z0-9]。
复杂举例
- /
\d{2, 4}
/ 匹配2到4间的数字 - /
\w{3} \d?
/ 匹配三个单字字符和一个任意的数字 - /
\s+java\s+
/ 匹配字符串"java" ,并且该串前后可以有一个或多个空格 - /
\d{3}|[a-z]{4}
/ 匹配的是要么是一个三位数,要么是四个小写字母 - /
java(script) ?
/ 匹配的是字符串 “java”,其后既可以有 “script”,也可以没有 - /
[' "] [^ ' "]*[' "]
/ 匹配的就是位于单引号或双引号之内的所有字符。但是它要求开始和结束的引号匹配(例如两个都是双引号或者都是单引号) - /
( [' "] ) [^ ' "] * \1
/ 如果要求开始和结束的引号匹配,\1 引用的是第一个代括号的子表达式。\3 引用的是第三个代括号的子表达式,注意由于子表达式可以嵌套在其它子表达式中,所以它的位置是被计数的左括号的位置 - /
\b java \b/gi
/ 匹配"java" 或"JAVA"。i 执行大小写不敏感的匹配;g 执行一个全局的匹配,简而言之,就是找到所有的匹配,而不是在找到第一个之后就停止了。g,i是正则表达式的属性。 - /
^\d{5,12}$
/ 匹配5位到12位数字 - /
\b\w{6}\b
/ 匹配刚好6个字符的单词
分枝条件 |
- /
0\d{2}-\d{8}|0\d{3}-\d{7}
/ 这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
分组()
小括号来指定子表达式(也叫做分组)
- /
(\d{1,3}\.){3}\d{1,3}
/ 是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}
匹配1到3位的数字,(\d{1,3}\.){3}
匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})
给匹配内容指定组名
代码/语法 | 说明 |
---|---|
(exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name’exp) |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面跟的不是exp的位置 |
(?<!exp) | 匹配前面不是exp的位置 |
(?#comment) | 注释,这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
举例:
- /
\b\w+(?=ing\b)
/ 匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc - /
(?<=\bre)\w+\b
/ 匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading - /
\d{3}(?!\d)
/ 匹配三位数字,而且这三位数字的后面不能是数字 - /
\b((?!abc)\w)+\b
/ 匹配不包含连续字符串abc的单词 - /
(?<=<(\w+)>).*(?=<\/\1>)
/ 匹配不包含属性的简单HTML标签内里的内容。
注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了