关于正则
1. 正则表达式入门
- 创建一个正则表达式对象
- 参数1: 模式
- 参数2: 修饰符
g:global
i:ignore
模式中如果有变量必须使用构造函数
var s = "box";
var re = new RegExp(s, "gi");
console.log(re);
使用字面创建正则表达式
var re1 = /box/gi;
console.log(re1);
2. 正则表达式的使用方式
var re = /box/gi;
re.lastIndex = 100;
console.log(re.lastIndex);
console.log(re.test("abOxBoxallbox")); //
console.log(re.lastIndex); //
console.log(re.test("box")); //
/*console.log(re.lastIndex);
var s = "aaaBoXaaaBox";
console.log(re.test(s));
console.log(re.lastIndex);
console.log(re.test(s));
console.log(re.lastIndex);
console.log(re.test(s));
console.log(re.lastIndex);
console.log(re.test(s));*/
3. 正则表达式方法exec
var re = /girl/gi;
var s = "abgiRllflGirlljlGIRLaaaaljlGirlldfjlGIRl";
var result;
<!--while((result = re.exec(s)) != null)-->
while(result = re.exec(s)){
console.log(result[0], result.index);
// giRl 2
// Girl 9
// GIRL 16
// Girl 27
// GIRl 36
}
4. 正则表达式规则
- `` : 匹配任意的字符
-
[123]
: 要么1要么2要么3 -
[^a]
: 不是字母a, 当把^放在[]中的时候表示非 -
\d
: 匹配的所有的数字 ===[0-9] d:digital -
\D
:匹配所有的非数字 ===[^0-9] -
\w
:匹配所有的单词字符,数字字母和下划线 ===[0-9a-zA-Z_] w:word -
^a
:以a开头(如果想限制字符串的长度,必须有开头和结尾) -
a$
:以a结尾 -
()
:进行分组 -
\|
:或 - 数量词: 默认贪婪模式,尽可能多
-
?
: 表示0个或1个 -
*
: 表示0个或多个 >=0 -
+
: 表示1个或多个 >=1 -
{m}
: 正好m个 -
{m,}
: m个或多个 >=m -
{m,n}
: 至少m个,最多n个
用户名: 只能用数字字母来表示, 开头不能是数字, 长度必须是 5-10个字符
var s = "ac1e11"
var re = /^[a-z][\da-z][\da-z][\da-z][\da-z]$/gi;
// 验证一个电话号码 ^1$
var num = "18603071634";
var re = /^1[3578]\d{9}$/gi;
console.log(re.test(num));
//验证邮箱
var email = "123@sohu.com";
var re = /^\w{3,15}@\w+\.(com|cn|org|edu|com\.cn)$/gi;
console.log(re.test(email));
//确定值是否为空
var s = "";
var re = /^$/gi;
console.log(re.test(" "));
5. 正则表达式的应用
一个正则表达式对象
- lastIndex
- test
- exec
正则表达式的规则
6. 字符串中的支持正则的四个方法
search
相当于正则的test
- 接收一个正则表达式
- 返回值是匹配的子字符串的下标
- 不管加不加'g',都是从头开始去查找匹配
- 返回值第一次满足的索引,g是无效的
var s = "11rru977ee";
var re = /\d{3}/i
console.log(s.search(re)); //5
match
相当于正则的exec
- 当传入一个正则的时候,会把匹配的所有的子字符串全部一次性的找到
- 所有匹配的子字符串组成的数组
var s = "w1221w";
var re = /\D+\d(\d{2})\d\D+/gi;
console.log(s.match(re)); //["w1221w"]
// console.log(s.match(/\d+/gi)); //["1221"]
// console.log(s.match(/[a-z]+/gi)); //["w", "w"]
- **例如网络爬虫/图片
<script src="lzl.js"></script>
</head>
<body>
<script>
var re = /https?:\/\/[^:]+\.(jpg|jpeg|png|gif)/gi;
var urls = s.match(re);
for(var url of urls){
var img = document.createElement("img");
img.src = url;
document.body.appendChild(img);
}
</script>
replace
- 替换
var s = "agc7739aaabu9u9";
console.log(s.replace(/[a-z]/gi, "")); //773999
console.log(s.replace(/\d{2}/gi, "")); // agcaaabu9u9
- 正则表达式中: 用\1用来捕获组,替换的字符串用$1
var s = "我我我我我我我哦喔喔今天天天要请你们吃吃吃吃饭";
// 正则表达式中: 用 \1 用来捕获组 替换的字符串:用 $1
console.log(s.replace(/(.)\1+/gi, "$1")); //我哦喔今天要请你们吃饭
- trim方法的正则表达式解法:
function myTrim(s){
return s.replace(/^\s+|\s+$/gi, "")
}
console.log("z" + myTrim(" \t ab ab \n") + "z"); //zab abz
var re = /.[A-Z]/g;
console.log("HelloMyWorld".replace(re, function(e){
// console.log(e);
// var arr = e.toLowerCase().split("");
// arr.splice(1, 0, " ");
// return arr.join("");
return e[0] + " " + e[1].toLowerCase(); //Hello my world
}));
split
- 切割, 有些情况可以和match达到同样的效果
- 参数2: 切出来大的数组的最大长度
var s = "aa11aa";
console.log(s.match(/[a-z]+/gi)); //["aa", "aa"]
console.log(s.split(/\d+/gi, 3)); //["aa", "aa"]
// 参数2:切出来的数组的最大长度
网友评论