正则表达式

正则表达式在线检测

语法

普通字符

字符 描述
[ABC] 匹配[]中的所有出现的字符,如[aeiou]匹配所有出现的a,e,i,o,u
[^ABC] 匹配除了[]中出现的所有字符
[A-Z] 匹配A-Z区间的所有大写字母,[a-z]同理匹配小写字母
. 匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]
[\s\S] 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,不包括换行
\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_] \W为[^A-Za-z0-9_]
\d [0-9]
\D [^0-9]

非打印字符

字符 描述
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\f 匹配一个换页符。等价于 \x0c 和 \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。

特殊字符

匹配本身需用\转义

字符 描述
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
. 匹配除换行符 \n 之外的任何单字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"**(.
[ 标记一个中括号表达式的开始。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。
{ 标记限定符表达式的开始。
| 指明两项之间的一个选择。

限定符

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。
n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
匹配0-99
/[0-9]{1,2}/

匹配 1~99
/[1-9][0-9]?/
/[1-9][0-9]{0,1}/

​ ***和+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。**通过在 *+? 限定符之后放置 ?,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。

<h1>RUNOOB-菜鸟教程</h1>
/<.*>/  贪婪匹配整个字符串
/<.*?>/    非贪婪只匹配<h1>
/<\w+?>/    匹配<h1>

定位符

​ 定位符能够将正则表达式固定到行首或行尾。它们还能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾.

注意:不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。

字符 描述
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b 匹配一个单词边界,即字与空格间的位置。
\B 非单词边界匹配。

匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首

/^Chapter [1-9][0-9]{0,1}/

真正的章节标题不仅出现行的开始处,而且它还是该行中仅有的文本。它既出现在行首又出现在同一行的结尾

/^Chapter [1-9][0-9]{0,1}$/

匹配单词 Chapter 的开头三个字符

/\bCha/

匹配单词 Chapter 的后三个字符

/ter\b/

匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt:

/\Bapt/

选择

​ 用圆括号 () 将所有选择项括起来,相邻的选择项之间用 | 分隔。() 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)。但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?: 放在第一个选项前来消除这种副作用。

var str ="123456lrdlrd12345lrdlrd6789";
var n=str.match(/([1-9])([a-z]+)/g);
n
(2)["6lrdlrd","5lrdlrd"]
n[0]
"6lrdlrd"
n[1]
"5lrdlrd"

先行断言 后行断言

?: 是非捕获元之一,还有两个非捕获元是 ?=?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

exp1(?=exp2):查找 exp2 前面的 exp1

(?<=exp2)exp1:查找 exp2 后面的 exp1

exp1(?!exp2):查找后面不是 exp2 的 exp1

(?<!exp2)exp1:查找前面不是 exp2 的 exp1

反向引用

​ 对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

​ 可以使用非捕获元字符 ?:?=?! 来重写捕获,忽略对相关匹配的保存

//查找重复的单词:
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/igm;
document.write(str.match(patt1));

​ 捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。

var str = "https://blog.lrdhappy.com/archives/html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
arr = str.match(patt1);
for (var i = 0; i < arr.length ; i++) {
    document.write(arr[i]);
	document.write("<br>");

第三行代码 str.match(patt1) 返回一个数组,实例中的数组包含 5 个元素,索引 0 对应的是整个字符串,索引 1 对应第一个匹配符(括号内),以此类推。

第一个括号子表达式捕获 Web 地址的协议部分。该子表达式匹配在冒号和两个正斜杠前面的任何单词。

第二个括号子表达式捕获地址的域地址部分。子表达式匹配非 :/ 之后的一个或多个字符。

第三个括号子表达式捕获端口号(如果指定了的话)。该子表达式匹配冒号后面的零个或多个数字。只能重复一次该子表达式。

最后,第四个括号子表达式捕获 Web 地址指定的路径和 / 或页信息。该子表达式能匹配不包括 # 或空格字符的任何字符序列。

将正则表达式应用到上面的 URI,各子匹配项包含下面的内容:

  • 第一个括号子表达式包含 https
  • 第二个括号子表达式包含 blog.lrdhappy.com
  • 第三个括号子表达式包含 undefined
  • 第四个括号子表达式包含 /archives/html

修饰符

/pattern/flags
修饰符 含义 描述
i ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
g global - 全局匹配 查找所有的匹配项。不加则默认显示第一个匹配项
m multi line - 多行匹配 使边界字符 ^$ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s 特殊字符圆点 . 中包含换行符 \n 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

其他元字符

\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,‘\x41’ 匹配 “A”。‘\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

运算符优先级

运算符 描述
\ 转义符
(), (?😃, (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,“或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food”。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

匹配规则

[0-9\.\-] // 匹配所有的数字,句号和减号 
[ \f\r\t\n] // 匹配所有的白字符
^\t 		//检测一个字符串是否以制表符开头
.{2}	所有的两个字符

字符簇

尽管 [a-z] 代表 26 个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。
^[a-z][0-9]$

第一个字符不能是数字:
^[^0-9][0-9]$
匹配包含文件名的字符串 filename.ext
/filename\.ext/

匹配 iframe 标签:

/<iframe(([\s\S])*?)<\/iframe>/

匹配所有 img 标签:

/<img.*?src="(.*?)".*?\/?>/gi

若要在中括号表达式中包括连字符-,请采用下列方法之一:

[\-]   	用反斜杠将它转义:

[-a-z]	将连字符放在中括号列表的开始或结尾
[a-z-]

[!--]	创建范围,开始字符值<连字符,结束字符值>=连字符
[!-~]

匹配出现在行首和行尾、后面跟一个或两个数字的 Chapter 或 Section

/^(Chapter|Section) [1-9][0-9]{0,1}$/

常用正则

正则表达式 描述
/\b([a-z]+) \1\b/gi 一个单词连续出现的位置。
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 匹配一个 URL 解析为协议、域、端口及相对路径。
`/^(?:Chapter Section) [1-9][0-9]{0,1}$/`
/[-a-z]/ a 至 z 共 26个 字母再加一个 - 号。
/ter\b/ 可匹配 chapter,而不能匹配 terminal。
/\Bapt/ 可匹配 chapter,而不能匹配 aptitude。
/^\s*$/ 匹配空行。
/\d{2}-\d{5}/ 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。
<[a-zA-Z]+.?>([\s\S]?) 匹配 HTML 标记。
[1]{0,}$ 中文正则
/[2]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/ 车牌号正则
/^[a-zA-Z]([-_a-zA-Z0-9]){5,19}$/ 微信号正则表达式,6至20位,以字母开头,字母,数字,减号,下划线
/^[1-9][0-9]{4,10}$/ QQ正则
`/^#?([a-fA-F0-9] [a-fA-F0-9]{3})$/`
/^.(?=.{6,})(?=.\d)(?=.[A-Z])(?=.[a-z])(?=.*[!@# %^&*? ]).* /; 密码强度正则,最少6位,包括至少1个大写字母,1个小写字母,1个数字,1个特殊字符
/[3]{4,16}$/ 用户名正则,4到16位(字母,数字,下划线,减号)
`/(([<>()[]\.,;:\s@“]+(.[^<>()[]\.,;:\s@”]+)*) (“.+”))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])
`(^\d{15}$) (^\d{18}$)
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.? 域名
^\d{4}-\d{1,2}-\d{1,2} 日期格式
`((2(5[0-5] [0-4]\d))

img

MySQL 正则表达式

# expr REGEXP 匹配条件 如果expr满足匹配条件,返回1;如果不满足,则返回0。
# 若expr或匹配条件任意一个为NULL,则结果为NULL。

select distinct id,age ,name from info
where name regexp '^a';#以a开头
select distinct id,age ,name from info
where name regexp '\_$';#以_结尾
select distinct id,age ,name from info
where name regexp '...';#匹配三个任意字符
模式 描述
^ 匹配以该字符后面的字符开头的字符串。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配以该字符前面的字符结尾的字符串。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式。
[…] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。
[^…] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc] 可以匹配 “plain” 中的’p’。
p1|p2|p3 匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。“[0-9]*”匹配任何数量的数字
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
SELECT * FROM fruits WHERE f_name REGEXP 'on';
#符查询f_name字段值为“on”的记录
SELECT * FROM fruits WHERE f_name REGEXP '[ot]';
#查找f_name字段中包含字母‘o’或者‘t’的记录
SELECT * FROM fruits WHERE f_id REGEXP '[^a-e1-2]';
#匹配指定字符以外的字符 “[^字符集合]” 匹配不在指定集合中的任何字符
SELECT * FROM fruits WHERE f_name REGEXP 'x{2,}';
#使用{n,}或者{n,m}来指定字符串连续出现的次数
SELECT * FROM fruits WHERE f_name REGEXP 'ba{1,3}';
#查询f_name字段值出现字符串“ba”最少1次、最多3次的记录

JavaScript 正则表达式

var pattern = /[]/,
	str = '';
console.log(pattern.test(str));

Java 正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches {
	
	public static void main(String args[]) {
		String str = "";
		String pattern = "[]";

		Pattern r = Pattern.compile(pattern);
		Matcher m = r.matcher(str);
		System.out.println(m.matches());
	}

}

Python 正则表达式

import re
pattern = re.compile(ur'[]')
str = u''
print(pattern.search(str))

  1. \u4e00-\u9fa5 ↩︎

  2. 京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z ↩︎

  3. a-zA-Z0-9_- ↩︎