元字符(断言)
.
匹配除换行符以外的任意字符\w
匹配字母或数字或下划线或汉字\s
匹配一个空白字符,包括空格、制表符、换页符和换行符。\d
匹配数字\b
匹配单词的开始或结束^
匹配字符串的开始$
匹配字符串的结束\n
匹配一个换行符\r
匹配一个回车符\0nn
ASCII 代码中八进制代码为nn的字符\xnn
ASCII 代码中十六进制代码为nn的字符\unnnn
Unicode 代码中十六进制代码为 nnnn 的字符 [\u4e00-\u9fa5]
如果我们要查找元字符本身需要加上 \
转义,如:\*
\\w
重复
*
重复零次或更多次+
重复一次或更多次?
重复零次或一次{n}
重复 n 次{n,}
重复 n 次或更多次{n,m}
重复 n 到 m 次
字符类
[a-zA-Z]
[\w]
[0-9]
分枝条件
|
或 注意:abc|eba
分组
(\d{1,3}){3}
反义
\W
匹配任意不是字母,数字,下划线,汉字的字符\S
匹配任意不是空白符的字符\D
匹配任意非数字的字符\B
匹配不是单词开头或结束的位置[^x]
匹配除了 x 以外的任意字符[^aeiou]
匹配除了 aeiou 这几个字母以外的任意字符
操练
0\d{2}-\d{8}
(?0\d{2})?[- ]?\d{8}|0\d{2}[- ]?\d{8}
((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
/(?\d{3})?([-\/.])\d{3}\1\d{4}/
反向引用
\n
命名分组
(?P<name>...)
例子:<([^>]+)>[\s\S]*?</\1>
非捕获分组
(?:...)
例子:(?:\d{4})-(\d{2})-(\d{2})
环视(零宽断言)
(?=...)
肯定顺序环视(向右)(?!...)
否定顺序环视(向右)(?<=..)
肯定逆序环视 (向左) Javascript 不支持(?<!..)
否定逆序环视 (向左) Javascript 不支持
例子:(<(?!/))
与 (<[^/])
区别1(?=\d{3})
贪婪与懒惰
*?
尽可能少的匹配(...)+?
其它
匹配模式i
不区分大小写g
全局查找, 不是找到第一个就停止m
多行模式
优化级()
*?+
abc
a|bc
Javascript 中的正则 API
正则对象
new RegExp(pattern [, flags])
好处是可以使用字符串拼接new RegExp("abc|" + foo)
/\d+/igm
字面量
注意:RegExp 这个对象保存了一些匹配对象的状态信息
source
表达式的文本形式global
是否指定的全局模式ignoreCase
是否标示不区分大小写模式multiline
是否指定了多行模式lastIndex
如果使用全局模式,变量保存的是在字符串中尝试下次匹配的偏移值exec
方法用于检索字符串中的正则表达式的匹配。
返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
var pattern = /\d{4}-\d{2}-\d{2}/;
var str = '2010-12-20 2011-02-14';
if((matchArray = pattern.exec(str)) != null){
console.log(matchArray)
// ["2010-12-20", index: 0, input: "2010-12-20 2011-02-14"]
}
var pattern = /\d{4}-\d{2}-\d{2}/g;
var str = '2010-12-20 2011-02-14';
while((matchArray = pattern.exec(str)) != null){
console.log(matchArray[0], matchArray.index, matchArray.lastIndex)
// "2010-12-20" 0 10
// "2011-02-14" 11 21
}
test
在测试正则表达式能否匹配文本,反正布尔值
小心那个 lastIndex
var pattern = /^\d{4}-\d{2}-\d{2}$/g
pattern.test("2010-12-20"); // true
pattern.test("2010-12-20"); // false
string.match(RegExp)
类似与 RegExp.exec(string)
, 唯一区别是无论是否指定全局模式, Regexp.exec()
总是返回单次的匹配结果,而 string.match()
在这种情况下会返回一个字符串数组,包含各次成功匹配结果。
string.search(RegExp)
返回正则表达式在字符串中第一次匹配的位置,不成功返回 -1
string.replace(RegExp, replacement)
默认情况下它只替换一次,要设置全局模式
replacement //字符中有一些特殊变量
$num //表示对应捕获分组匹配的文本
$$ //$字符
$` //匹配文本之前(左侧)的文本
$' //匹配文本之后(右侧)的文本
string.replace(RegExp, function)
function
接收一个字符串,也返回一个字符串
"one two three".replace(/\bt[a-zA-Z]+\b/g, function(m){
return m.toUpperCase()
})
// one TWO THREE
string.split(RegExp)
使用正则来切分字符串,全局模式不影响它
var matchArray = "one two three".split(/\s+/)
相关参考:
http://deerchao.net/tutorials/regex/regex.htm
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions
关注 web翎云阁,定时推送,互动精彩多,若你有更好的见解,欢迎留言探讨!