RegExp(pattern [, flags])
/pattern/flags
flags:有以下任意组合
m:让开始和结束字符(^ 和 $)工作在多行模式,而不只是整个输入字符串的最开始和最末尾处。
var reg = /^f\wo$/g;
str = "foo\nfbo\nfco";
str.match(reg); // null
reg = /^f\wo$/gm;
str.match(reg); // ["foo", "fbo", "fco"]
.
:匹配任意字符(换行符除外),如果为了匹配换行符,可以使用[^]
,这样在多行模式中就可以匹配换行符了。
/.y/匹配"yes my name is Bob."中的"my",但是不匹配"yes"
\d
:匹配阿拉伯数字0-9,等价于[0-9]
\D
:和\d
相反。匹配任何非0-9阿拉伯数字的字符,等价于[^0-9]
。
/\d/或/[0-9]/匹配"2b"中的"2"
/\D/或/[^0-9]/匹配"2b"中的"b"
\w
:匹配任意来自基本拉丁字母表中的字母数字字符,还包括下划线。等价于 [A-Za-z0-9_]。
\W
:和\w
相反。匹配任意不是基本拉丁字母表中单词字符的字符。等价于 [^A-Za-z0-9_]。
/\w/g或/[A-Za-z0-9_]/g匹配"$12.5"中的"1","2","5"
/\W/g或/[^A-Za-z0-9_]/g匹配"$12.5"中的"$","."
\s
:匹配一个空白符,包括空格、制表符、换页符、换行符和其他 Unicode 空格。
\S
:和\s
相反。匹配一个非空白字符。
/\s\w*/ 匹配 "foo bar" 中的 ' bar'。
/\S\w*/ 匹配 "foo bar" 中的 'foo'。
\t
:匹配一个水平制表符(tab)。
\r
:匹配一个回车符。
\n
:匹配一个换行符。
\v
:匹配一个垂直制表符。
\f
:匹配一个换页符。
[\b]
:匹配一个退格符,注意区分和\b
的区别。
\0
:匹配一个 NUL 字符。不要在此后面跟小数点。[没搞懂 -.-! ]
\cX
:X 是 A - Z 的一个字母。匹配字符串中的一个控制字符。
/\cM/ 匹配字符串中的 control-M。// 实践没有成功,eslint不建议使用
\uhhhh
:匹配 Unicode 值为 hhhh (四个十六进制数字)的字符。
\xhh
:匹配编码为 hh (两个十六进制数字)的字符。基本等同于\u00hh
/\u0057/或/\x57/ 匹配 "World"中的"W"
\
:转义符号。
/\/w/匹配"q/wert"中的"/w"
[xyz]
:一个字符集合,匹配集合中的任意一个字符。可以使用连字符'-'指定一个范围。 [^xyz]
:匹配任意不在括号内的字符。也可以通过使用连字符 '-' 指定一个范围内的字符。
/[abcde]/g 等价于 /[a-e]/g,匹配"apple"中的"a","e"
/[^abcde]/g 等价于 /^[a-e]/g,匹配"apple"中的"p","p","l"
^
:字符串的开始$
:字符串的结尾
/^a/ 匹配"apple"中的"a"
/e$/ 匹配"apple"中的"e"
\b
:匹配一个零宽单词边界,如一个字母与一个空格之间。
\B
:和\b
相反。匹配一个零宽非单词边界。
/\bon/g 匹配"onon onon"中第一个,第三个"on"
/\Bon/g 匹配"onon onon"中第二个,第四个"on"
【注】:\b指的单词边界表示任何单词边界,即单词和单词之间的非单词的都算是单词边界,如-
.
等符号。
/\bon/g 匹配"onon-onon"或"onon.onon"或"onon=onon"中第一个,第三个"on"
但是下划线不可以,/\bon/g只能匹配"onon_onon"的第一个on,我的理解是除\w包括的字符之外,其他的都可以算做单词边界。
(x)
:匹配 x 并且捕获匹配项。
/@(\w*)\./ 匹配"yjy@gmail.com"中的"@gmail",同时会捕获"gmail"
/(foo|bar|baz)/g 匹配"testfooandbar"中的"foo","bar"
\n
:n是正整数,一个反向引用,指向正则表达式中第n个括号(从左开始数)中匹配的子字符串。
/(foo)bar\1/ 匹配"foobarfoo",同时会捕获第一个"foo"
x*
:匹配模式x
0或者多次x+
:匹配模式x
至少一次,等价于 {1,}
。
/fo+/无法匹配"f"
/fo*/匹配 "f"中的"f"
x*? / x+?
:像*
和+
一样匹配前面的模式x
,然而匹配是最小可能匹配。也叫非贪婪模式。
/<.*>/ 匹配 "<div><span>"中的"<div><span>"
/<.*?>/ 匹配 "<div><span>"中的"<div>"
x?
:匹配前面的模式x
0或1次,也就是x
是可选的
/^(?:\w+)@(?:[a-z]+)\.\w+(?:\.\w+)?$/ 匹配 "admin@meituan.com"或匹配"admin@meituan.com.cn"
但是不匹配 "admin@meituan" 和 "admin@meituan.com.cn.org"
x|y
:匹配x或者y
/green|red/ 匹配"green apple" 中的 ‘green',"red apple." 中的 'red'。
x{n}
:n 是一个正整数。前面的模式 x 连续出现 n 次时匹配。
/o{2}/ 匹配 "foo"中的"oo"
x{n,}
:n 是一个正整数。前面的模式 x 连续出现至少 n 次时匹配。当n=1时,等同于x+
/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 中所有的 "a"。
x{n,m}
:n 和 m 为正整数。前面的模式 x 连续出现至少 n 次,至多 m 次时匹配。
/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a"
正向或反向预查都是非获取匹配,javascript不支持反向预查
(?:x)
:匹配 x 不会捕获匹配项。(是否属于正向预查有争议)
/^(?:\w+)@(?:[a-z]+)\.\w+$/ 匹配 "admin@meituan.com",但是不捕获任何字串
x(?=y)
:只有当 x 后面紧跟着 y 时,才匹配 x。又叫正向肯定预查。
x(?!y)
:只有当 x 后面不是紧跟着 y 时,才匹配 x。又叫正向否定预查。
/foo(?=bar)/ 匹配"foobarfoobaz"中的第一个"foo"
/foo(?!bar)/ 匹配"foobarfoobaz"中的第二个"foo"
(?<=pattern)
:与正向肯定预查类似,只是方向相反。又叫反向肯定预查。(?<!pattern)
:与正向否定预查类似,又叫反向否定预查。
/(?<=95|98)Windows/ 匹配"98Windows"中的"Windows"但是不匹配"2000Windows"
/(?<!98)Windows/ 则正好相反,匹配"2000Windows"中的"Windows"但是不匹配"98Windows"
JavaScript不支持反向预查,使用python实现
import re
print(re.search('(?<=95|98)Windows', '98Windows').group(0) == 'Windows')
print(re.search('(?<=95|98)Windows', '2000Windows') == None)
print(re.search('(?<!98)Windows', '95Windows').group(0) == 'Windows')
print(re.search('(?<!98)Windows', '98windows') == None)
RegExp.$1-$9
:$1, $2, $3, $4, $5, $6, $7, $8, $9 是正则表达式括号字符串中的静态只读匹配项。RegExp.lastMatch ($&)
:最后匹配的结果RegExp.lastParen ($+)
:最后一个获取匹配RegExp.leftContext ($`)
:匹配内容左侧是文本RegExp.prototype.global
:是否开启了全局匹配模式,只读,不可枚举,不可配置。RegExp.prototype.ignoreCase
:是否开启忽略大小模式,只读,不可枚举,不可配置。RegExp.prototype.multiline
:是否开启多行模式,只读,不可枚举,不可配置。RegExp.prototype.source
:返回一个值为当前正则表达式对象的模式文本的字符串,该字符串不会包含正则字面量两边的斜杠以及任何的标志字符。
var regex = /^(?:\w+)@(?:[a-z]+)\.\w+$/ig;
console.log(regex.source); // "^(?:\w+)@(?:[a-z]+)\.\w+$",不包含 /.../ 和 "ig"。
RegExp.prototype.lastIndex
:下次匹配开始的字符串索引位置。详细使用查看exec方法。
RegExp.prototype.compile
:类似于编译的函数。已弃用,不赘述。RegExp.prototype.test
:测试当前正则是否能匹配目标字符串。返回true
或false
。
/\d{3}/.test(123); //true
/\d{3}/.test(1234); //true
/\d{3}/.test(12); //false
test
方法类似于String.search()
。
RegExp.prototype.exec
:在目标字符串中执行一次正则匹配操作。它的返回值是一个数组或者null
。
var reg = /^([a-z]*)-[^-]*/ig,
str = "angular-ui-router",
result;
result = reg.exec(str);
result[0] = "angular-ui"; //匹配结果
result[1] = "angular"; //捕获结果
result.input = "angular-ui-router"; //输入字符串
result.index = "0"; // 匹配的开始索引
reg.lastIndex = 10; //下一次匹配开始的位置
result = reg.exec(str); // 再次执行,开始的索引变成10
result = null; // 匹配不到结果
reg.lastIndex = 0; // 又从头开始执行匹配
/^[\u4e00-\u9fa5]*$/
:匹配汉字/^(\-)?\d+(\.\d{1,2})?$/
:1或者2为小数的正负数/^1\d{10}/
:匹配手机号(粗略)/^\d{3}-\d{8}|\d{4}-\d{7}$/
:匹配座机号码xxx-xxxxxxxx,xxxx-xxxxxxx/^\d{15}|\d{18}$/
:匹配身份证号/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
:Email地址/^\d{4}-\d{1,2}-\d{1,2}/
:YYYY-MM-DD格式的日期 /\.xxx$/
:匹配后缀名为xxx的文件/\d+\.\d+\.\d+\.\d+/
:匹配IP地址/^http(s)?:\/\/([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$/
:匹配URL/<([a-z]+)>(?:[^]*)<\/\1>|<[a-z]+\/>/g
:简单匹配HTML标签