正则表达式
- 转义字符
‘\’ 为转义字符
\n 为 新行
\r 行结束,换行
\t 制表符 缩进
// 在innerHTML 里面换行会报错 ,需要有\转掉
document.body.innerHTML = "\
<div></div>\
<span></span>\
";
RegExp
-
创建正则表达式
1 正则表达式自变量
判断有没有abc片段
var reg = /abc/
abcd : true
var reg = /abe/
abcd: false
2 new RegExp()构造函数
第一个参数写判断主题,第二个写判断出现的修饰符
var reg = new RegExp(“abc”,“img”)
也可以把以声明的正则表达式填里面
var reg = /abce/m
var reg1 =new RegExp(reg)
不互相印象
如果不用new 则使用同一个引用地址 会相互影响 -
i
当在正则自变量后面出现 i 则忽视大小写
var reg = /abce/i
ABCEd : true -
g
全局匹配 查找所有,而不是查找到第一个后停止
var reg = /ab/
var str = ababa
str.match(reg) //['ab']
加上g
reg = /ab/g
str.match(reg) // ['ab','ab']
- m
多行匹配
当使用/n /s 会生效
var reg = /^a/g;
var str = "abcde\na"
str.match(reg) ['a']
var reg = /^a/gm;
str.match(reg) ['a','a']
表达式规则
-
[]
中括号里写的东西表示正则表达式可以取到的范围
/[123456789] [123456789][123456789]/
匹配连续的三个数,每个方括号只代表一个值
string= 123agad712345asdfa
匹配出 123 712
/[ab][cd][d]/g
str = abcd
匹配出 bcd
方括号里可以简写
[0-9A-Za-z] [A-z] 按照asc码排序 -
^
当^放在表达式里,代表取反
var reg = /[^a][^b]/g
代表第一个不是a 第二个不是b
var str = ab1cd
匹配出 b1 cd -
()
圆括号里可以加| 代表或
/(abc|bcd)/
abc,bcd都可以匹配
/(abc|bcd)[0-9]/
代表abc或者bcd后面跟一位数字 -
子表达式
子表达式也是() ,代表反向引用
reg = /(\w)\1/g
\1是匹配第一个子表达式里的内容
str = “aaaa”
reg = /(\w)\1\1\1/g 匹配成功 “aaaa”
匹配 str = “aaabbb”
reg = /(\w)\1\1(\w)\2\2/g 匹配成功 “aaabbb”
元字符
- \w
/w代表[0-9A-z_]
数字字母下划线
/W = [^\w] 数字字母下划线取反
str = bcd2
/\wcd2/g 可以匹配
/\Wcd2/g 无法匹配
-\d
\d [0-9] 数字
\D[^0-9] 非数字
reg = /\d\d\d/
str = 123 可以匹配
str = 13 无法匹配
-
\s
\s 空白字符
\S 非空白字符
换行符\n 制表符\t 回车\r 换页符\f 垂直制表符\v 加上空格 -
\b
\d 单词边界
\B 非单词边界
reg = /\bce/g
str = abc ced defg 匹配出ce -
\t
制表符
reg = /\tc/g
str = as tclj123 无法匹配
str = as/tclidfsf可以匹配
不是视觉上的制表符,而是内容/t /n同理 -
\uxxx
匹配unicode编码
/[\u000-\ufff] 匹配一切
写一个方法包含一切
[\s\S] [\d\D] -
.
[^\r\n] 匹配一切除了\r,\n
量词
-
+
+ 相当于{1, } 一到正无穷
reg = /\w+/g
str = “abc” 匹配成功 “abc”
var reg = /\w*/g
str = ‘aaaaaaaaaaaaa’ 匹配成功 ‘aaaaaaaaaaaaa’
贪婪匹配原则,尽量匹配多 -
*
* 相当于{0, } 零到正无穷
reg = /\w*/g
str = “abc” 匹配成功 “abc”,""
abc匹配完因为光标定位,
还有逻辑上的距离,*匹配空
reg - /\d*/g
str = abc 匹配成功 “”,"","",""
-
?
相当于{0-1}
reg = /\w?/g
str = ‘12345’ 匹配成功’1’,‘2’,‘3’,‘4’,‘5’,’’ -
{}
填写一个数字{匹配个数}
填写两数字{匹配的最小个数,匹配的最大个数}
填写一个数字和, {1,} 1到正无穷 -
^
以···开头
reg = /^abc/
str = abcdefg 匹配成功 “abc” -
$
以···结尾
reg = /cge$/
str = abcge 匹配成功 “cge”
reg = /^abc$/g
str = abcabc 无法匹配 abc必须同时满足开头和结尾
正向预查
根据条件查询其他的字符
- ?=n 匹配任何其后紧接指定字符串n的字符串
var str = “abaaaaa”
var reg = /a(?=b)/g 匹配成功 [“a”] - ?!n 匹配任何后面不是指定字符串的n的字符
var reg = /a(?!b)/g 匹配成功 [“a”,“a”,“a”,“a”,“a”]
贪婪匹配
正常情况下都是贪婪匹配
非贪婪: 在量词后面加?
var str = “aaaaa”
var reg = /a+?/g 匹配结果: [“a”,“a”,“a”,“a”,“a”]
var reg = /a??/g 匹配结果: ["","","","",""]
var reg = /a*?/g 匹配结果: ["","","","",""]
正则表达式对象的属性
global 对象是否含有g
ignoreCase 对象是否含有i
mulitiline 对象是否含有m
lastIndex 表示开始下一次匹配的字符位置
source 整个这表达式的源文本
正则表达式方法
reg.exec()
var reg = /ab/g;
var str = “abababab”
reg.exec(str) 匹配成功 [“ab”]
返回一个类数组 有个游标 index
第一次index:0
第二次会接着第一次的游标 [“ab”] index:2
当最后返回null,然后从头再次匹配
游标index就是lastIndex的值
当正则不加G的话 游标不会动
当使用子表达式()时,会多两位数组位
匹配 str = “aaabbb”
reg = /(\w)\1\1(\w)\2\2/g 匹配成功 “aaabbb”
reg.exec(str) 返回类数组 [“aaabbb”,“a”,“b”]
reg.test() 检验是否符合要求
reg.compile()
面试题:
- 写出一条正则判断首尾是否含有数字
var reg = /^\d|\d$/g
如果是首尾都含有数字
var reg = /^\d[\s\S]*\d$/g
-
replace 替换重复的字符
“aa”.replace(“a”,“b”) ==> “ba” -
把字符串倒过来
str = “aabb”
reg = /(\w)\1(\w)\2/g
str.replace(reg,"$2$2$1$1")
$可以引用子表达式
可以用函数表示
str.replace(reg,function($,$1,$2) {
// 第一个参数代表字符串全局
return $2+$2+$1+$1
})
如果想替换$ 需要$$ -
把-链接改成小驼峰写法
var str = thie-first-name
str.replace(/-(\w)/g,function($,$1){
return $1.toUpperCase()
}) -
字符串去重
var str =“aaaabbbcccc”
var reg = /(\w)\1*/g
str.replace(reg,"$1") -
百度难题 把数字写成科学记数法
var str = 1000000000
var reg = /(?=(\B)(\d{3})+$)/g
str.replace(reg,".")
1 使用$从后往前查
2 找3位数字
3 用正向预查查找后面是三位数字
4 不是单词边界