正则表达式复习

RegExp

正则表达式的作用:匹配特殊字符或有特殊搭配原则的字符的最佳选择。
参考w3shcool-JavaScript RegExp对象

两种创建方式

  • 1 直接量 (推荐)
var reg = /abc/i;/* ignoreCase表示忽略大小写 */
var str = "abdec";
console.log(reg.test(str));//false
  • 2 new RegExp();
//var reg = new RegExp("abc");
//也可以带参数
var reg = new RegExp("abc", "m");

修饰符i\m\g

修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
// var reg = /^a/g; //表示匹配以a开头的字母
var str = "abcde\na";//中间插入一个换行符,目前没有多行匹配功能,故只能匹配到一个a
var reg = /^a/gm;
var str = "abcde\na";//可以匹配到两个a
str.match(reg);//["a","a"]

// reg.test();----> 返回的是true/false
// str.match();---->返回所有匹配上的片段

// 一个[]代表一位,其中输入范围
var reg = /[1234567890]/g;
// 范例:
var reg = /[ab][cd][d]/g;
var str = "abcd";
reg.test(str);//["bcd"]

// ^放在表达式[]中表示非
var reg = /[^a][^b]/g;

// | 表示或
var reg = /(abc|bcd)/g;
var str = "bcd";

// \w === [0-9A-z_]
var reg = /\w/g;
var str = "bcd2_";
str.match(reg);//["b", "c", "d", "2", "_"]

// \W === [^\w]
var reg = /\Wcd2/g;
var str = "b*cd2";

// \d === [0-9]
var reg = /\d\d\d/g;
var str = "123";
// \D === [^\d]

// \s 用于查找空白字符
// \s === [\t\n\r\v\f ]  \s 等于这5个加空格
/* 
    空白符
    制表符
    回车符
    换行符
    垂直换行符
    换页符
*/

//  \b === 单词边界
// \B === 非单词边界
var reg = /\bc/g;//表示以c为单词边界

//键盘的tab系统不认,应用\t

//u0000  四位的unicode编码。 16进制
//unicode编码时分层的
//\u010000 - \u01ffff.   第一层
//\u020000 - \u02ffff。  第二层
//\u100000 - \u10ffff。  第三层
//[unicode编码在线转换]
var reg = /[\u0000-\uffff]/g;
var str = "老邓身体好";

//注意: 如何匹配所有
var reg = /[\s\S]/g;

// . === [^\r\n]
var reg = /./g;
var str = "老 邓身体好";

// 这些都是贪婪匹配原则,能多就不会少
// n+ === {1,}
// n* === {0,}
// n? === {0,1}
// n{X} === {x}
// n{x,y} === {x,y}
// n{x,} === {x,正无穷}

// 注意:下面的例子容易错
var reg = /\d*/g;
var str = "abc"; //["","","",""]

var reg = /\w?/g;
var str = "aaaaaa"; //["a","a","a","a","a","a",""]

var reg = /\w{3}/g;
var str = "aaaaaaa";  //3个3个匹配 ["aaa","aaa"]

var reg = /\w{3,5}/g;
var str = "aaaaaaa";	//贪婪匹配原则,能多就不能少 ["aaaaa"]

var reg = /\w{1,}/g;
var str = "aaaaaaa";	//["aaaaaaa"]

//^ -->以……开头
//$ -->以……结尾

//检查一个字符串首尾是否有数字
var reg = /^\d|\d$/g;
var str = "abc";

//检查首尾都含有数字
var reg = /^\d[\s\S]*\d$/g;
var str = "123abc";

//查看在reg中是否写了i,g,m
reg.ignoreCase	//false
reg.global	//true
reg.multiline	//false

reg.source	//"^\d[\s\S]*\d$"

reg.exec(str)	//检索字符串中指定的值,返回找到的值,并确定其位置
//["ab",index: 0,input: "aba",groups:undefined]
var reg = /ab/g;	//正则表达式不加\g,reg.lastIndex压根就不动
var str = "abababab";

//reg.lastIndex 游标属性
console.log(reg.lastIndex);//0	游标的位置
console.log(reg.exec(str));//["ab", index: 0, input: "abababab", groups:undefined]
console.log(reg.lastIndex);//2
console.log(reg.exec(str));//["ab", index: 0, input: "abababab", groups: undefined]
console.log(reg.lastIndex);//4
console.log(reg.exec(str));//["ab", index: 4, input: "abababab", groups: undefined]
console.log(reg.lastIndex);//6
console.log(reg.exec(str));//["ab", index: 6, input: "abababab", groups: undefined]
console.log(reg.lastIndex);//8
console.log(reg.exec(str));//null
console.log(reg.lastIndex);//0
console.log(reg.exec(str));//["ab", index: 0, input: "abababab", groups: undefined]

// 题目: 匹配"xxxx"的所有的字符串
var reg = /(a)\1/g;	//其中(a)是子表达式,"\1"反向引用了表达式
var str = "aaaa";
var reg = /(\w)\1/g;	//\w匹配出来的内容,我后面要copy一个一模一样的出来
var reg = /(\w)\1\1\1/g;

var str = "aabb";
var reg = /(\w)\1(\w)\2/g;	"\2"是反向匹配第二个表达式的内容
console.log(str.match(reg));	//reg不加/g -->["aabb","a","b",index:0,input: "aabb"] reg加上/g ---> ["aabb"]

//支持正则表达式的String对象的方法
search\match\replace\split	-->详细信息见http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp

console.log(str.search(reg));	//匹配不到时返回-1,上面的匹配到的情况,返回0,加不加/g没有区别
var str = "aabb";
var str1 = "qwertaauiop[bbjkl"
var reg = /(\w)\1/g;
console.log(str.split(reg));	//按单词重复的地方拆字符串 ["","a","","b",""]
console.log(str1.split(reg));	//["qwert","a","uiop[","b","jkl"]

var str = "qwe1ty2ui";
var reg = /\d/g;	\\按照数字来拆分	["qwe","1","ty","2","us"]

//replace	替换与正则表达式的匹配
var str = "aa";
console.log(str.replace("a","b"));	//不用正则表达式没有匹配全局的能力	"ba"

var reg = /a/g;
var str = "aa";
console.log(str.replace(reg,"b"));	//不加g -->ba	加g-->bb 注意注意!!

//思考: 如何将aabb-->倒过来变成bbaa
var reg = /(\w)\1(\2)\2/g;
var str = "aabb";
console.log(str.replace(reg,"$2$2$1$1"));	//这第二个参数必须是字符串	$1是第一个子表达式的内容,$2表示第二个子表达式的内容
//也可以写函数返回字符串
console.log(str.replace(reg,function($,$1,$2){
	
	return $2 + $2 + $1 + $1;
}));	//$全局匹配的字符串,$1第一个子表达式,$2第2个子表达式

//变大写变小写
str.toUpperCase().toLowerCase();

//将the-first-name---> theFirstName
var reg = /-(\w)/g;
var str = "the-first-name";
console.log(reg,function($,$1){
	return $1.toUpperCase();
});

//思考: 要选择一个a使它后面必须跟着b,后面跟着b的a符合要求
//?=n 匹配任何气候紧跟指定字符串n的字符串
var str ="abaaaa";
var reg = /a(?=b)/g;	//a后面跟着b,但b不参与选择只参与修饰
var reg = /a(?!b)/g;	//后面不跟着b的那个a
//?=n	正向预查
//?!n	非正向预查
var str = "aaaa";
var reg = /a+?/g;	//非贪婪匹配

//在量词的后面加?(转入非贪婪匹配)有1绝对不取2
var reg = /a{1,3}?/g;

var reg = /a??/g;	第一个?量词,第二个?非贪婪匹配,能取零绝不取一;

//思考:字符串去重
var str = "aaaaaaabbbbbcccccccccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg,"$1"));

//思考 如何var = str="100000000"-->100.000.000
//1、一定要从后往前查询,要用到$
//2、匹配这样一个空,空后面跟着3的倍数位数字
var str = "100000000";
var reg = /(?=(\d{3})+$)/g; var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,"."));	//将空替换成·
//必须得是非单词边界,故加上(\B)

匹配中文的正则表达式:
[\u4e00-\u9fa5]+

posted @ 2019-05-21 18:44  芥末Yuki  阅读(3)  评论(0)    收藏  举报