正则表达式

要匹配一位小写字母:[a-z] 共26个
要匹配一位大写字母:[A-Z] 共26个
要匹配一位字母: [A-Za-z] 共52个
要匹配一位字母或数字:[0-9A-Za-z] 共62个
要匹配一位汉字:[\u4e00-\u9fa5]
要匹配一位数字: \d 等效于 [0-9]
要匹配一位字母、数字或_: \w 等效于 [0-9A-Za-z_]
要匹配一位空字符:\s 可匹配 空格、制表符Tab等空白
要匹配所有文字(通配符): .
有明确数量边界的数量词
字符集{n} 表示字符集必须重复n次,不能多也不能少
字符集{n,m} 表示字符集至少重复n次,最多重复m次,
比如: \d{4,6} 表示4到6位数字
字符集{n,} 表示字符集匹配的内容至少重复n次,多了不限,
比如:\d{6,} 表示6位以上数字
没有明确数量边界的数量词
* 可有可无,多了不限
? 可有可无,最多一次
+ 至少一次,多了不限
指定匹配位置
^ 表示字符串开头
$ 表示字符串结尾
\b 表示单词边界,可匹配:空格,标点符号,字符串开头和结尾等可将一个单词与其它单词分割开的符号。

String类型提供的正则相关函数

  1. 查找敏感词
    (1). 查找一个固定的敏感词出现的位置:
    var i=str.indexOf(“敏感词”,fromi)
    (2). 用正则模糊查找一个敏感词的位置:
    var i=str.search(/正则/i)
    (3). 查找敏感词的内容:
    a. 查找一个敏感词的内容和位置
    var arr=str.match(/正则/i)
// var str="老师: 请用小红 我的 朋友造句。小亮:小红是我的朋友。小然: 朋友!小红是我的!";

var str="no zuo no die,no can no bibi";
//查找所有以小字开头的人名都有哪些?
var arr=str.match(/小[\u4e00-\u9fa5]/ig)
console.log(arr);
//将所有以小字开头的人名都替换为**
str=str.replace(/小[\u4e00-\u9fa5]/ig,"**");
console.log(str);
/*如果arr不是null
if(arr!=null){
  console.log(`共替换${arr.length}处`);
}else{//否则
  console.log(`共替换0处`);
}*/
console.log(`共替换${arr!=null?arr.length:0}处`);

强调: 不加g时,match返回的arr数组中只有一个敏感词,但是,即有内容,又有位置:
arr=[“0”:“敏感词内容”,“index”:“敏感词位置”]
b. 查找所有敏感词的内容
var arr=str.match(/正则/ig)
强调: 加g后,match返回的arr数组中包含所有敏感词的内容,但是,无法显示每个敏感词的位置!
arr=[“敏感词1”,“敏感词2”,“敏感词3”,…]
0 1 2
match如果找不到,返回null!
今后,如果一个函数,有可能返回null!都必须先验证不是null!才能继续使用!如果是null,还要提供备选方案!

(4). 既查找所有敏感词,又能获得每个敏感词的位置
reg.exec()
2. 替换敏感词
(1). 简单替换: 将所有敏感词都替换为统一的新值
a. str=str.replace(/正则/ig, “新值”)

//鄙视题: 将每个单词首字母改大写
var str="you can you up";
//       ↑   ↑   ↑   ↑
str=str.replace(
  /\b[a-z]/ig,
  //          y     c     y     u
  //          ↓
  function(keyword){//要求一
    console.log(`调用了一次回调函数,keyword=${keyword}, 返回${keyword.toUpperCase()}`);
    return keyword.toUpperCase()
  }
)
console.log(str);//You Can You Up

b. 将str中所有符合正则要求的敏感词都替换为统一的新值,返回新的字符串,保存到变量中。
强调: 字符串在多数编程语言中都是不可变类型!
一旦创建,内容不可改变!
所以,所有字符串家的函数: replace(), toUpperCase(), toLowerCase(),都无权修改原字符串,只能返回新字符串。所以,要想获得新字符串,都必须用变量接住返回值。如果不用变量接,则函数肯定执行了,也有返回值,只不过,返回值没人要,被垃圾回收!
vs 数组在js中是可变类型!所以几乎所有数组家提供的函数: sort(), reverse(), push()都不用变量接返回值,而是直接修改原数组!

(2). 高级替换: 根据每个敏感词的不同,动态选择不同的新值替换。
a. str=str.replace(/正则/ig, function(keyword){
return 根据接受的不同的敏感词,返回不同的新值
})
b. 原理:
1). replace会用正则表达式在字符串str中查找所有敏感词。
2). 每找到一个敏感词,就自动调用一次回调函数。每次调用回调函数时,都会自动将本次找到的敏感词传给回调函数的参数keyword。
3). 在回调函数内部,根据本次传入的敏感词是什么,来动态返回不同的新值。
4). replace会自动将回调函数返回的新值,替换到字符串中本次找到的敏感词的位置。
回调函数: 我们自己定义的函数,但是自己不调用,而是传给别的函数,由别的函数去调用。
特点: 何时调用不知道!调用几次不知道!每次调用传什么参数值也不知道!

(3). 删除敏感词: 其实就是把敏感词替换为""

  1. 切割字符串: 将一个字符串按指定的切割符,切割为多段子字符串。
    (1). 简单切割: 切割符是固定的
    a. var arr=str.split(“切割符”);
    b. 将字符串str,按指定的"切割符"切割为多段子字符串。
    c. 返回值:
    1). 返回切割后的多段子字符串组成的数组
    2). 切割的结果中,不包含切割符
    (2). 复杂切割: 切割符不是固定的
    a. var arr=str.split(/正则/);
    b. 将字符串str,按每个符合正则要求的切割符,切割为多段子字符串。
    c. 返回值:
    1). 返回切割后的多段子字符串组成的数组
    2). 切割的结果中,不包含切割符
    d. 强调: 切割时,即使不加g,也能找到所有切割符,切割。
    (3). 将字符串打散为字符数组:
    a. 问题: 虽然字符串长得像数组(下标, .length),但是因为不是数组家孩子,所以无法使用数组家的函数。

    b. 何时: 如果字符串也想调用数组家的函数,就可先打散字符串为字符数组,再调用数组家函数。最后,将处理后的字符数组,再用join("")无缝拼接回字符串。
    c. 如何: var arr=str.split("")
    d. 返回值: 由打散字符串后的多个字符组成的字符数组。

二. RegExp对象:

  1. 什么是RegExp对象: 专门保存一条正则表达式,并提供用正则表达式执行验证和查找功能的函数 的对象
  2. 为什么: 因为正则表达式本不属于js语言,js语言默认不认识正则表达式!所以需要专门的对象来帮助js解析和使用正则表达式。
  3. 何时: 只要在js中使用正则表达式,都要先创建正则表达式对象,再使用。
  4. 如何:
    (1). 创建正则表达式对象:
    a. 用//创建: var reg=/正则/ig
    1). 何时: 如果正则表达式是固定不变的,才可用//创建
    2). 比如: 电子邮件,手机号,身份证号,车牌照
    b. 用new创建: var reg=new RegExp(“正则”,“ig”)
    1). 何时: 如果正则表达式需要在程序内动态生成,就只能用new创建!
    2). 因为: //之中不能写js表达式或语句,只有""才能用js任意生成!
    (2). 正则表达式对象提供的函数:
    a. 验证格式:
    1). var bool=正则表达式.test(要检查的字符串)
    2). 原理: 用正则表达式检查指定字符串,如果字符串格式符合正则表达式要求,就返回true,否则如果字符串格式不符合正则表达式要求,就返回false
    因为test()函数的返回值本来就是bool类型,所以可直接用做判断条件
    3). 坑: test()函数默认只要在字符串中找到部分内容和正则匹配,就返回true!而不是要求从头到尾必须完整匹配!
    4). 解决: 只要验证格式,正则中必须前加^,后加$,表示从头到尾必须完整匹配的意思!
    b. 既查找每个敏感词的内容,又查找每个敏感词的位置
    1). var arr=正则表达式.exec(可能包含敏感词的字符串)
    2). 强调: 要想exec能找所有,正则后必须加g
    3). 原理: 从当前位置开始,查找下一个符合正则表达式要求的敏感词的位置和内容。
    4). 返回值: exec()每次查找返回的结果和match不加g时返回的结果数组结构完全相同:
    arr=[
    “0”:“本次敏感词的内容”,
    “index”:“本次敏感词的位置”
    ]
    5). vs match(): 反复调用:
    i. match()的问题: 永远只能从开头位置开始找第一个敏感词。无法继续找第二个敏感词。
    ii. exec()反复调用,自己就会找下一个!直到找不到,返回null!

总结:

  1. 查找敏感词:
    (1). 查找一个固定的敏感词的位置:
    var i=str.indexOf(“敏感词”,fromi)
    (2). 用正则模糊查找一个敏感词的位置:
    var i=str.search(/正则/i)
    (3). 获得敏感词的内容:
    a. 获得一个敏感词的内容和位置:
    var arr=str.match(/正则/i)
    b. 获得所有敏感词的内容:
    var arr=str.match(/正则/ig) //g global 全部
    (4). 获得每个敏感词的内容和位置:
    reg.exec()
  2. 替换敏感词:
    (1). 简单替换: 将所有敏感词都替换为一个统一的新值
    str=str.replace(/正则/ig,“新值”)
    (2). 高级替换: 根据敏感词的不同,动态选择不同的新值替换
    str=str.replace(/正则/ig, function(kw){
    return 根据kw值得不同,动态生成不同的新值
    })
<ul id="ulScores">
  <li>85</li>
  <li>75</li>
  <li>92</li>
  <li>66</li>
</ul>
<script>
//其实元素的id名,会被浏览器自动生成为全局变量。做练习时,可以不用getXXX(),直接使用id名,就可获得元素对象
console.log(ulScores);
//获得ulScores的HTML内容: 
var html=ulScores.innerHTML;
console.log(html)
//删除开头的空字符和<li>
html=html.replace(/^\s*<li>/,"");
//删除结尾的</li>和空字符
html=html.replace(/<\/li>\s*$/,"");
//按</li>空字符<li>切割
var arr=html.split(/<\/li>\s*<li>/)
console.log(arr);//[85,75,92,66]
</script>

(3). 删除敏感词: 其实就是替换为""
3. 切割字符串
(1). 简单切割: 切割符是固定的
var arr=str.split(“切割符”)
(2). 高级切割: 切割符是不固定的,但是有规律
var arr=str.split(/正则/)
(3). 打散字符串为字符数组:
var arr=str.split("")

//将电子邮件地址按@切割,获得其中的用户名和域名
var email="wushen@sina.cn";
//      ["zhangdong","tedu.cn"]
//          [0]          [1]
var arr=email.split("@");
var uname=arr[0];
var domain=arr[1];
console.log(uname, domain);

//将一句英文句子按空格切割为多个单词
var str="you can you up,no can no bibi";
var arr=str.split(/\s|,/);
console.log(arr);
var arr=["h","e","l","l","o"];
arr.reverse();
console.log(arr);
//鄙视题: 如何翻转字符串
var str="helloworld";
//将str字符串切割为字符数组
var arr=str.split("");
console.log(arr);
//调用数组家的翻转函数,翻转数组内容
arr.reverse();
//将翻转后的数组,再无缝拼接回字符串
str=arr.join("");
console.log(str);
  1. 去掉开头和结尾的空字符:
    (1). 只去开头的空字符: str.trimLeft()
    (2). 只去结尾的空字符: str.trimRight()
    (3). 同时去掉开头和结尾的空字符: str.trim()
var str="   wu   shen   ";
//删除str开头的空字符
function ltrim(str){
  return str.replace(/^\s+/,"");
}
//删除str结尾的空字符
function rtrim(str){

}
//删除str开头和结尾的空字符
function trim(str){

}
console.log(ltrim(str));
//"wu   shen   "
console.log(rtrim(str));
//"   wu   shen"
console.log(trim(str));
//"wu   shen"

//新版本浏览器中,已经包含,可直接使用!
console.log(str.trimLeft());
console.log(str.trimRight());
console.log(str.trim());
  //从服务器端请求回来一个敏感词数组: 
  var kws=["明月","青天","翠柳"]
  var str=kws.join("|");
  console.log(str);
  //         明月| 青天 |紫烟
  </script>
</head>
<body>
<script>
//请用户输入一条消息
var msg=prompt("请输入消息内容")
//判断msg中是否包含指定的敏感词
//var arr=msg.match(/kws.join("|")/i);
var arr=msg.match(
  new RegExp(kws.join("|"))
)
//如果找到敏感词,就禁止发送
if(arr!=null){
  document.write(`<h1 style="color:red">在位置${arr.index}发现敏感词${arr[0]},禁止发送!</h1>`)
}else{//否则如果没找到敏感词才能发送
  document.write(`<h1 style="color:green">子曰:${msg}</h1>`)
}
//请用户输入一个手机号
var phone=prompt("请输入手机号")
//如果用正则验证手机号通过
if(/^1[3-9]\d{9}$/.test(phone)){
  //就提示手机号可用
  document.write(`<h1 style="color:green">手机号可用</h1>`)
}else{//否则
  //就提示手机号格式不正确
  document.write(`<h1 style="color:red">手机号格式不正确</h1>`)
}
var str="老师: 请用小红 我的 朋友造句。小亮:小红是我的朋友。小然: 朋友!小红是我的!";
//      new RegExp() 一次
var reg=/小[\u4e00-\u9fa5]/g;
//      .lastIndex=?
//用循环反复调用reg.exec(),直到返回null就不要再调用了
do{
  //尝试查找一次敏感词
  var arr=reg.exec(str);
  //如果找到,才输出
  if(arr!=null){
    console.log(`在位置${arr.index},找到敏感词${arr[0]}`);
  }else{//否则如果找不到敏感词了,就退出循环
    break;
  }
}while(true);

正则整理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
正则表达式自动生成器是一个智能、易用的正则表达式生成、测试以及字符串提取工具。正则表达式库让你可以直接借用正则表达式,而无需自己费脑筋。“正则表达式自动生成器”可以自动生成正则表达式,测试正则表达式,可视化显示结果,导出提取字符串,你所要做的,仅仅是几下鼠标点击! 正则表达式自动生成器主要功能: 自动生成正则表达式 编辑并测试正则表达式 多向导页,可在多个源文本上测试同一个正则表达式(标准版无此功能) 多页参考生成正则表达式(标准版无此功能) 自动检查和修改生成的正则表达式的正确性 以可视方式呈现测试结果 从文本文件中获取源文本 从HTML页面中获取源代码 一键导出匹配文本 一键导出提取字符组,并按自定义的分隔符进行分隔 保存项目以便重复测试和修改 在“设计元素”中学习并创建正则表达式 直接从正则表达式库中选择利用正则表达式 多语种 100%-200%大字体下完美显示 你可以从任何纯文本中提取有规律的文字,比如txt文件,XML文件,csv文件,HTML文件等,然后导出到剪贴板或文本文件中,你可以很方便地把它们导入到程序,数据库,excel文件等。 正则表达式自动生成器现在有三个语言版本: 英语,简体中文,繁体中文,我们会在以后加入其他语言,比如日语,德语和法语等。 正则表达式自动生成器更新内容: 1、修复一些小bug。 2、增加自定义组和限定词的正则表达式 3、增加自定义窗口背景 4、增加自定义按钮背景 5、修改软件时间为UTC时间(日志除外) 6、修改更新模块 正则表达式自动生成器截图:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dev _

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值