正则表达式

一、两种创建方式
1.直接量   var reg=/abc/;
2.new RegExp(); //var reg=new RegExp('abc','i');

二、修饰符

i:ignoreCase 忽略大小写

g:全局匹配

m:多行匹配

var reg=/^a/m;
var str='abcde\na';//\n 换行
console.log(str.match(reg)); // ["a", "a"]
//转义字符 \ :\r\n 回车换行 \t 制表符
var html='\
<div>\
    <span>123</span>\
</div>';

document.body.innerHTML=html;

 

三、方括号(代表一位)

[abc] : 查找方括号之间的字符。

[^abc] : 查找不在方括号之间的字符

[0-9],[a-z],[A-Z],[A-z] :查找0到9的数字 等

(red|blue|green) :查找指定的选项。

 
var reg=/(abc|bcd)[0-9]/g;
var str='abc3bcd2';
console.log(str.match(reg)); //  ["abc3", "bcd2"]

 四、元字符:拥有特殊含义的字符

. : [^\r\n] 查找单个字符,除了换行和行结束符。

\w : [0-9A-z_] ,\W:[^\w]

\d : [0-9],\D:[^\d]

\s : [\t\n\r\v\f ] 空白字符, \S:[^\s]

\b : 单词边界 \B:[^\b]

//单词边界
var reg=/\bfce\b/g;
var str='asd fce sdf';
console.log(str.match(reg));//["fce"]

 五、量词:代表数量

 n+ : {1,} 1到多个

 n* : {0,}

 n? : {0,1}

 n{X} : X个

 n{X,Y} : X-Y个

 n{X,} : X到多个

 ?=n : 匹配其后紧接n 的字符串

 ?!n : 匹配其后没有紧接n 的字符串

 
// 正向预查  正向断言
var reg=/\d+(?=ab)/g; //匹配其后有ab的字符串
var reg1=/\d+(?!ab)/g; //匹配其后没有ab的字符串
var str='31abc12';
console.log(str.match(reg));//[31],不包括括号的内容
console.log(str.match(reg1));//[3,12]

六、RegExp对象属性

global :RegExp对象是否具有标志 g。

ignoreCase :是否具有标志 i

multiline :是否具有标志 m。

source :正则表达式的源文本。

lastIndex :一个整数,标示开始下一次匹配的字符位置。

 
七、RegExp对象方法

 compile:编译正则表达式

 exec:检索字符串中指定的值。返回找到的值,并确定位置

 test:检索字符串中指定的值。返回true或false

 

// eg:exec ,lastIndex
var reg=/ab/g;
var str='ababab';

console.log(reg.lastIndex);//游标的位置 0
console.log(reg.exec(str));// ["ab", index: 0, input: "abababab"]

console.log(reg.lastIndex);//游标的位置 2
console.log(reg.exec(str));// ["ab", index: 2, input: "abababab"]

console.log(reg.lastIndex);//游标的位置 4
console.log(reg.exec(str));// ["ab", index: 4, input: "abababab"]

 

八、支持正则表达式的string对象的方法

search :返回匹配的位置,匹配不到返回-1

match :返回匹配的数组

replace:替换与正则表达式匹配的子串

split: 把字符串分割为字符串数组

 
var str='asdaabb';
var reg=/(\w)\1(\w)\2/g;

console.log(str.match(reg));//["aabb"]

console.log(str.search(reg));//3 

console.log(str.replace(reg,'11111'));//asd11111

console.log(str.split(reg));//["asd", "a", "b", ""]  返回的数组中包括与这些子表达式匹配的字串

 

 九、子表达式,非贪婪匹配

// ()子表达式 \1代表和前面子表达式的内容相同
var str='aabb';
var reg=/(\w)\1(\w)\2/g;

console.log(str.match(reg));//["aabb"]
console.log(reg.exec(str)); //["aabb", "a", "b", index: 0, input: "aabb"] 数组a,b分别是两个子表达式的内容
// 默认贪婪匹配,非贪婪匹配:增加?

var str='aaaa';

var reg=/a{1,3}/g;//贪婪匹配 ,先匹配a的数量是3
var reg1=/a{1,3}?/g;//非贪婪匹配 ,先匹配a的数量是1
var reg2=/a??/g;//第一个?:(0,1),第二个?:非贪婪匹配 ,先匹配a的数量是0

console.log(str.match(reg));//[aaa,a]
console.log(str.match(reg1));//[a,a,a,a] 
console.log(str.match(reg2));//["", "", "", "", ""] 

十、例子

//检验字符串首尾是否含有数字,->首或者尾  

var reg=/^\d|\d$/g; //首或者尾 是数字
var reg1=/^\d[\w\W]*\d$/g; //首尾都是数字 

var str='123qwe31a1';
console.log(reg.test(str));
 //把aabb 换成 bbaa

var reg=/(\w)\1(\w)\2/g;
var str='aabb';

console.log(str.replace(reg,'$2$2$1$1'));//$1代表第一个子表达式

// 参数1:匹配全局(aabb) 参数2:匹配一个子表达式(a)参数3:匹配一个子表达式(b)
console.log(str.replace(reg,function($,$1,$2){
    return $2+$2+$1+$1
}));
// the-first-name  换成 theFirstName

var str='the-first-name';
var reg=/-(\w)/g;
console.log(str.replace(reg,function($,$1){
    return $1.toLocaleUpperCase();
}))
// 将aaabbbbccccc 换成 abc
var str='aaaaaaaaaaabbbbbbbbbcccccccccccc';
var reg=/(\w)\1*/g;
console.log(str.match(reg)); //["aaaaaaaaaaa", "bbbbbbbbb", "cccccccccccc"]
console.log(str.replace(reg,'$1'));//abc
// 将str 换成 10,000,000
var str='100000000000';

var reg=/(?=(\B)(\d{3})+$)/g;

console.log(str.match(reg));

console.log(str.replace(reg,','));

 

 

 

posted @ 2018-08-17 11:37  yuesu  阅读(335)  评论(0编辑  收藏  举报