正则表达式如何使用?
1、如何声明一个正则表达式?
//声明正则表达式有两种方式: //第一种: var pattern=/[0-9]+/ig; //这样就声明了一个正则表达式 //第二种: var pattern=new RegExp([0-9]+,"ig"); //以上就是两种创建的方法
2、如何去使用呢?
正则表达式的几种方法
pattern.test() 返回是否匹配成功
pattern.exec() 返回匹配成功后的这个数组
构造函数
1.new创建正则表达式
new RegExp(pattern, attributes)
2.直接量语法
/pattern/attributes
例如:
pattern=/[0-9]+/ig
配置参数
i 不区分大小写
g 全部匹配
m 匹配换行
i 不区分大小写的匹配
s 匹配任意字符,包括换行符在内
U 表示非贪婪
? 表示0个或1个
+ 表示1个或多个
* 表示0个或多个
\d 任意一个数字 [0-9]
\D 任意一个除了数字之外的字符 [^0-9]
\s 任意一个空间字符,空格,\r \n \t\f [\r\n\t\f ]
\S 任意非空白 [^\r\n\t\f ]
\w 任意一个字a-z A-Z 0-9 _ [a-zA-Z0-9_]
\W 任意一个非字 [^a-zA-Z0-9_]
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
var dataType={
"any":/[\w\W]+/, //任何数据
"any6-16":/^[\w\W]{6,16}$/, //6-16位的任何数据
"n":/^\d+$/, //数字类型
"n6-16":/^\d{6,16}$/, //数字类型 6-16位
"s":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/,
"s6-18":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$/,
"p":/^[0-9]{6}$/,//post 邮政编码
"m":/^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$/, //手机
"e":/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, //邮箱
"url":/^(\w+:\/\/)?\w+(\.\w+)+.*$/ //url验证
}
var tipmsg={//默认提示文字;
tit:"提示信息",
w:{
"*":"不能为空!",
"*6-16":"请填写6到16位任意字符!",
"n":"请填写数字!",
"n6-16":"请填写6到16位数字!",
"s":"不能输入特殊字符!",
"s6-18":"请填写6到18位字符!",
"p":"请填写邮政编码!",
"m":"请填写手机号码!",
"e":"邮箱地址格式不对!",
"url":"请填写网址!"
},
def:"请填写正确信息!",
undef:"datatype未定义!",
reck:"两次输入的内容不一致!",
r:"通过信息验证!",
c:"正在检测信息…",
s:"请{填写|选择}{0|信息}!",
v:"所填信息没有经过验证,请稍后…",
p:"正在提交数据…"
}
//使用方法:
alert(dataType.s.test("中国"));

正则表达式的写法:
字面写法

正则表达式-对象写法

正则表达式示例代码:
let str = 'song';
let div = document.querySelector('div');
console.log(str.replace('s','S')); //Song
console.log(str.replace(/\w/,'S')); //Song
console.log(str.replace(/\w/g,'S'));//SSSS
console.log(str.replace(/\w/g,search=>{
console.log(search);
}));
匹配到的每一个字符都会去替换
let str = 'song';
let div = document.querySelector('div');
console.log(str.replace('s','S')); //Song
console.log(str.replace(/\w/,'S')); //Song
console.log(str.replace(/\w/g,'S'));//SSSS
console.log(str.replace(/\w/g,search=>{
return "哈哈"
}));
小案例
通过正则表达式将搜索的内容变成红色



代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>代码高亮显示</title>
</head>
<body>
<div class="content">
xiaosongit.com
</div>
<script>
let con = prompt("请输入要高亮的内容 支持正则表达式");
console.log(con);
let reg = new RegExp(con,'g');
let div = document.querySelector('div');
div.innerHTML = div.innerHTML.replace(reg, search => {
return `<span style="color:red">${search}</span>`;
});
</script>
</body>
</html>边界符号
^ $
小案例
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>代码高亮显示</title>
</head>
<body>
<input name="username"/>
<span id="result"></span>
<script>
// let input = document.querySelector('input[name="username"]').addEventListener("keyup", function () {
// console.log(this.value);
// });
let input = document.querySelector('input[name="username"]').addEventListener("keyup", function () {
let flag = this.value.match(/^[\w]{3,6}$/i);
if (flag) {
document.querySelector('span#result').innerHTML = "成功";
} else {
// if(this.value.length>=3){
// document.querySelector('span#result').innerHTML="失败";
// }
document.querySelector('span#result').innerHTML = "失败";
}
});
</script>
</body>
</html>





匹配到空白
\s
匹配到空白,才返回真
console.log(/\s/.test("\nxiasong")); //true
console.log(/\s/.test("xiaosong")); //false匹配里面的中文

/[^-\d:,]+/g 除了中括号里面的值,都要

其实中文是 4e00-9fa5
正则表达式为 /[u4e00-u9fa5]+/g

小案例 邮箱匹配
<script> let email1 = "574482856@qq.com"; let email2 = "songjiabing@163.com"; let email3 = "syz@126.com.cn"; let email4 = "syz@126."; let email5 = "sysdf"; let pattern = /^[\w_-]+@[\w]+\.[\w\.]+$/; console.log(pattern.test(email1)); console.log(pattern.test(email2)); console.log(pattern.test(email3)); console.log(pattern.test(email4)); console.log(pattern.test(email5)); </script>

点 \d \w . 包含除了换行符所有的字符
匹配模式 m 视为单行匹配
匹配任何字符 /[\d\D]+/ 或者 [\s\S] [\w\W] 匹配强度比 . 更加强大
模式修正符

g 全局匹配
i 不区分大小写
m 视为单行匹配

字符串的 replace 可以完成替换

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多行匹配</title>
</head>
<body>
<input name="username"/>
<span id="result"></span>
<script>
let str=`
#1 js,200元 #
#2 php,300元 #
#3 python,300元 # python课程
#4 node.js,180元 #
`;
//要求 找到字符中以 # 结尾的所有课程
let pattern = /^\s*\#\d+\s+.+\s*\#$/gim;
str.match(pattern).map(val=>{
val = val.replace(/\s*#|#/g,"");
console.log(val)
});
</script>
</body>
</html>排除匹配
let str="xiaosongit.com";
console.log(str.match(/[ao]/gi)); //查找到a o 里面的任何一项都返回 ["a", "o", "o", "o"]
console.log(str.match(/[^ao]/gi)); //查找到 除了 a o 里面的任何一项都返回 ["x", "i", "s", "n", "g", "i", "t", ".", "c", "m"]
let strHan="xiaosongit.com是一个博客站。"; //是一个博客站
console.log(strHan.match(/\p{sc=Han}+/gu));原子组认识

let str = ` <h1>xiaosongit.com</h1> <h2>小站</h2> `; let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi; console.log(str.replace(reg, `<p>$2</p>`)); <p>xiaosongit.com</p> <p>小站</p>

批量替换
let str = ` <h1>xiaosongit.com</h1> <h2>小站</h2> `; let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi; console.log(str.replace(reg, `<p>$2</p>`)); 结果: <p>xiaosongit.com</p> <p>小站</p>
//正则 需要仔细,需要理解透彻 才能写出最规范的代码
let str = `
<h1>xiaosongit.com</h1>
<h2>小站</h2>
`;
let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi;
let data = [];
while(res = reg.exec(str)){
data.push(res);
}
console.log(data);
let str = `
<h1>xiaosongit.com</h1>
<h2>小站</h2>
`;
//拿到 h1=>xiaosongit.com h2=>小站
let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi;
let data = [];
while(res = reg.exec(str)){
data.push({"name":res[1],"value":res[2]});
}
console.log(data);
let str = `
<h1>xiaosongit.com</h1>
<h2>小站</h2>
`;
//拿到 h1=>xiaosongit.com h2=>小站
let reg = /<(h[1-6])>([\s\S]+)<\/\1>/gi;
let data = [];
while(res = reg.exec(str)){
data.push({"name":res[1],"value":res[2]});
}
console.log(data);
console.log(JSON.stringify(data,null,2));
忽略原子组记录
?: 不记录到原子组中
let str = `
http://www.xiaosongit.com
https://admin.xiaosongit.com
https://api.xiaosongit.com
`;
//匹配到里面所有的域名 除去http 和https 例如 www.xiaosongit.com api.xiaosongit.com
let reg = /https?:\/\/(([\w]+)\.([\w]+)\.(com|org|cn|com.cn))/gis;
let data = [];
let res;
while(res =reg.exec(str)){
console.log(res);
data.push(res[1]);
}
console.dir(data);
现在我不想要 2/3/4 这里的数据,应该怎么去掉呢?
两种解决办法:
1、使用 ?: 的办法
let str = `
http://www.xiaosongit.com
https://admin.xiaosongit.com
https://api.xiaosongit.com
`;
//匹配到里面所有的域名 除去http 和https 例如 www.xiaosongit.com api.xiaosongit.com
let reg = /https?:\/\/(([\w]+)\.(?:[\w]+)\.(?:com|org|cn|com.cn))/gis;
let data = [];
let res;
while(res =reg.exec(str)){
console.log(res);
data.push(res[1]);
}
console.dir(data);

2、无用的匹配 可以不用括号包裹
let str = `
http://www.xiaosongit.com
https://admin.xiaosongit.com
https://api.xiaosongit.com
`;
//匹配到里面所有的域名 除去http 和https 例如 www.xiaosongit.com api.xiaosongit.com
// let reg = /https?:\/\/((?:[\w]+)\.(?:[\w]+)\.(?:com|org|cn|com.cn))/gis;
let reg = /https?:\/\/([\w]+\.[\w]+\.com|org|cn|com.cn)/gis;
let data = [];
let res;
while(res =reg.exec(str)){
console.log(res);
data.push(res[1]);
}
console.dir(data);
贪婪模式
? 0个或1个
{}
用户名验证

多个正则作用在一个事件上

禁止贪婪
?往少的一方面获取 不让它贪婪
let str="passsssssssssss"
/pas*?/ig
小案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>高亮显示</title>
</head>
<body>
<span>http://www.xiaosongit.com</span>
<span>https://admin.xiaosongit.com</span>
<span>https://api.xiaosongit.com</span>
</body>
<script>
//1.将body中的span标签替换成h2
//2.将h2中的内容改成红色
//3.在原有标签中添加一个 `正则替换`
const content = document.querySelector('body');
let reg = /<span>([\s\S]+?)<\/span>/gi; // ?是取消贪婪模式重要的标志,不能删除
content.innerHTML = content.innerHTML.replace(reg, (v, p1) => {
return "<h2 style='color:red;'>正则替换 "+p1+"</h2>";
});
</script>
</html>

全局匹配

match search
正则替换
$& 匹配到的值
$1 第一个括号中的值
$2
$` 匹配内容的前面
$' 匹配内容后面的内容
小案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示</title>
</head>
<body>
<span>在线教育是一种高效的学习方式,大家都很喜欢在线教育</span>
</body>
<script>
//要求 将span中的教育 加上一个连接
let span = document.querySelector('span');
let reg =/教育/g;
span.innerHTML= span.innerHTML.replace(reg,`<a href='http://www.xiaosongit.com'>$&</a>`);
</script>
</html>

给原子组起一个别名 ?<con> 这就是给原子组起的名字

给原子组起名小案例
<body> <a id="id" href="www.xiaosongit.com">小宋程序站点</a> <a style="" id" href="http://www.sina.com">新浪</a> <a href="http://www.163.com">网易</a> </body>

断言
?<= 断言标识符
let reg = /(?<=\d{7})\d{4}/gi
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>代码高亮显示</title>
</head>
<body>
<span>13818612345</span>
</body>
<script>
let span = document.querySelector('span');
let reg = /(?<=\d{7})\d{4}/ig;
span.innerHTML = span.innerHTML.replace(reg,v=>{
console.log(v);
return "*".repeat(4);
});
</script>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示</title>
</head>
<body>
<span>13818612345</span>
</body>
<script>
let span = document.querySelector('span');
let reg = /(?<=\d{7})\d{4}/ig;
//这样的写法也是可以的
span.innerHTML = span.innerHTML.replace(reg,function(v){
console.log(v);
return "*".repeat(4);
});
// span.innerHTML = span.innerHTML.replace(reg,v=>{
// console.log(v);
// return "*".repeat(4);
// });
</script>
</html>


这样的写法也能满足。