初识:
正则表达式的作用:匹配特殊字符或者有特殊搭配原则的字符的最佳选择
//创建方式:
//1. var reg=/abc/mgi;
//2. var reg1=RegExp("abc","mgi");
正则表达式的三个属性:
g:全局匹配
i:忽视大小写
m:执行多行匹配
/^a/:(匹配以a开头的a)
//关于属性 m
var reg=/^a/gm;
var str="abcde\na"; //加上m属性后可以匹配到两个a
1
2
3
reg.text(); 匹配字符串中是否有相同顺序的字符
str.match() 将匹配相同的字符串全部打印出来
表达式[]:
var reg=/[范围][][]/g;
//eg:[0123]范围是:0,1,2,3 []叫表达式,一个[]代表一位 此处表示匹配三位 从匹配完的下一位开始看
// [0-9A-z]都可以 注意:空格等字符都可以作为有效的范围
var reg=/[1234567890][1234567890][1234567890]/g;
var str="hello9899world1212hi14213i3i3i3";
var reg=/[ab][cd][d]/g; //注意:不可以有任意多余的空格
eg:var reg=/[ab] [cd] [d]/g; 这样写结果为:null
var str="abcd"; //结果:"bcd"被匹配出来
[^a](匹配非a)
//例1.
var reg=/[^a][^b]/g;
var str="ab1cb";
//例2.
var reg=/[^a] [^b]/g;
var str="ab 1cb";
var reg=/(abc|bcd)/g; //匹配abc 或bcd
元字符:
//可以在表达式里面写多个元字符;
\w===[0-9A-z_]
\W===[^\w]
\d===[0-9]
\D===[^\d]
\s===[\t\n\r\v\f ]
//查找空白字符 (空格符 , tab\t, 回车\r, 换行\n, 垂直换行符\v, 换页符\f)
\S===[^\s]
\b===单词边界
\B===非单词边界
var reg=/\babc\b/g;
var str="hello abc world"; //结果["abc"]
\t
var reg=/\ta/g;
var str="hello abcworld";
//var str="hello\tabcworld"; //匹配结果都为:[" a"]
\uxxxx //(查找以十六进制数xxxx规定的 Unicode 编码可以匹配汉字 范围\u0000~\uffff)
.===[^\r\n]
//一个可以包含一切字符的
var str=/[\d\D]/g;
量词:
原则:贪婪匹配 (非贪婪匹配 在量词的后面加一个? 例如:n+?)
n+ {1,+} //可以出现1~无数次 n 为一个变量
n* {0,+}
var reg=/\w*/g;
var str="abc" //结果:["abc", ""]
//原因 当匹配上"abc"后光标在c的后面 全局匹配 所以就再匹配出""
var reg=/\d*/g;
var str="abc" //结果: ["", "", "", ""]
n? {0,1}
n{X} {X} //X个X个匹配
n{x,y} //区间 x~y 贪婪匹配原则(n{3,4})能4个匹配就不会3个匹配!!!
n{x,} //x~正无穷
var reg=/\w{3}/g; //!!注意此处是\w匹配
var str="aaaaaaaaaaaa" //结果:["aaa", "aaa", "aaa", "aaa"]
/ab$/ (已b结尾的)
//检验一个字符串首尾都有数字
var reg =/^\d[\s\S]*\d$/g;
正则表达式上的方法:
text();
exec();
var reg=/ab/g; //没有g的时候光标会一直再0的位置,不会向下便利
var str="abab";
console.log(reg.lastIndex,reg.exec(str)); //reg.lastIndex 记录光标当前所处的位置
console.log(reg.lastIndex,reg.exec(str));
console.log(reg.lastIndex,reg.exec(str));
console.log(reg.lastIndex,reg.exec(str));
console.log(reg.lastIndex,reg.exec(str));
var str="aabb"; //匹配 aabb 形式
var reg=/(\w)\1(\w)\2/g; //(\w)子表达式,\1反向引用第一个子表达式,\2反向引用第二个系表达式
console.log(reg.exec(str)); //
字符串上的方法:
match(); 匹配多个必须加上条件
replace(); 只能匹配一个
var str="aabb"; //匹配 aabb 形式 以bbaa形式输出
var reg=/(\w)\1(\w)\2/g;
console.log(str.replace(reg,"$2$2$1$1")); //结果:bbaa 后面内容用字符串包裹起来
//$2 第二个子表达式的内容 $1 第一个子表达式的内容
//例1. 将the-first-name 这种形式的字符串转换为 theFirstName
var reg=/-(\w)/g;
var str = "the-first-name";
console.log(str.replace(reg,function($,$1){ //传入内容和第一位子表达式 当然也可以这样写:(str,$1)
return $1.toUpperCase();
}))
正向预查:
(?=n)
(?!=n)
//例 1.选出a的字符串 a的限定条件后面紧跟一个b(但是选择输出时不能输出b)
var str="abaaaaa";
var reg=/a(?=b)/g; //结果 "a" 只选取出一个字符串 ["a"]
练习:
//例1.
var str="aa\\aa\\aa"; //正则表达式匹配\ ? * 等要加转意符号
var reg=/\\/g; //str.match(reg) 结果:["\", "\"]
//例2.字符串去重
var str="aaaaaaaaabbbbbbcccc";
var reg=/(\w)\1*/g;
console.log(str.replace(reg,"$1")); //结果:abc
//例3.将下列字符串转换为100.000.000 每隔三个打一个点
var str="100000000"; 前面是非单词边界,从后往前查,查3的位数个
var reg=/(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,".")); //结果:100.000.000