JS经典正则表达式笔试题汇总


Posted in Javascript onDecember 15, 2016

本文实例总结了JS经典正则表达式笔试题。分享给大家供大家参考,具体如下:

一.复习字符串的传统操作

如何获取一个字符串中的数字字符,并按数组形式输出,如

dgfhfgh254bhku289fgdhdy675gfh

输出[254,289,675]

分析:循环用charAt()的方法获取到每一个子字符串,判断他是不是在0~9之间,是就把他扔到准备好的数组里

var str="dgfhfgh254bhku289fgdhdy675gfh";
findNum(str);
function findNum(){
 var arr=[];
 for(var i=0;i<str.length;i++){
  if(str.charAt(i)<='9'&&str.charAt(i)>='0'){
   arr.push(str.charAt(i));
   alert(arr);
  }
 }
}

但是这样会输出[2,5,4,2,8,9,6,7,5]和我们想要的结果有点偏差,于是我们需要一个新的空的字符串,每次碰到是数字走if,碰到字符走else,走else的时候把之前那些数字存放到新的空的字符串里,然后通过push添加到数组,然后清空字符串,一以便下次重新存放

var str="dgfhfgh254bhku289fgdhdy675";
findNum(str);
function findNum(){
 var arr=[];
 var result="";
 for(var i=0;i<str.length;i++){
  if(str.charAt(i)<='9'&&str.charAt(i)>='0'){
   result+=str.charAt(i);  //注意添加方向不要反了
  }
  else{
   if(result){
    arr.push(result);
    result="";
   }
  }
 }
 alert(arr)
}

还有个隐患:如果最后以数字结尾,则最后不会进入else,最后几位数字会读不到,因此for循环外面再添加一遍else里面的if循环

二.什么是正则,有什么用

正则:也叫做规则,让计算机能够读懂人类的规则

*前端哪些地方用到正则?

比如注册页面输入用户名,我们给定一套规则,判断他输入的对不对

*范围?

正则都是用来操作字符串的(即不要用他去操作对象什么的)

*怎么写?

正则也是一个系统对象,跟数组、json一样,也有个写法规则

简写   var re=//;  //只写两斜杠,浏览器会认为是注释,所以尽量不要给他为空,注意两斜杠之间不要有引号

全称   var re=new RegExp();  //Reg是正则的简写,Exp是表达式的简写

大部分情况用简写,只有一种情况用全称写法:正则需要传参的时候

注:全称写法用到\时,需要两个\\,否则是转义字符

三.正则表达式的常用方法

1.test

正则去匹配字符串,如果匹配成功就返回真,匹配失败就返回假

写法:正则.test(字符串)

如:

var str='abcdef';
var re=/b/; //bc一个整体也在字符串中,弹出true,但是写bd,弹出false,因为字符串中没有bd这么一个整体
alert(re.test(str));

弹出true

扩展:

检测一个字符串是不是全是数字

var str='8621t56461';
var re=//;
if(re.test(str)){
 alert("不全是数字");
}
else{
 alert("全是数字");
}

两斜杠之间要写什么呢?引入转义字符

\s(\S):空格(非空格)

\d(\D):数字(非数字)

\w(\W):字符(非字符)   字符包括字母、数字、下划线

2.search

正则去匹配字符串,如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回-1

search的写法:字符串.search(正则)

如:

var str="abcdef";
var re=/b/;
alert(str.search(re));
//返回1
var re=/w/;
//返回-1
var re=/B/;
//返回-1

正则中的默认:是区分大小写的

如果要不区分大小写,在正则的最后加标识i

var re=/B/i

完整写法:

var re=new RegExp("B","i");

3.match

正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null

match的写法:字符串.match(正则)

比如上面例子要找出数字

var str="dgfhfgh254bhku289fgdhdy675";
var re=/\d/;
alert(str.match(re));
//输出2

为什么后面的不找了?

正则默认:正则匹配成功就会结束,不会继续匹配

如果想要全部查找,就要加标识g(全局匹配)

var re=/\d/g;
//输出2,5,4,2,8,9,6,7,5

跟我们想要的结果还是有偏差,如果要连着找到,而不是一个个分开,则需要

var re=/\d\d/g; //两个两个找
var re=/\d\d\d/g; //三个三个找

但是个数不一定时怎么找,引进量词

量词:匹配不确定的位置

+:至少出现一次

var re=/\d+/g;

就实现上面的效果了

4.replace

正则去匹配字符串,匹配成功的字符去替换新的字符串

replace的写法:字符串.replace(正则,新的字符串)

如:

var str="aaa";
var re=/a/;
str=str.replace(re,"b");
alert(str);
//输出baa

敏感词过滤例子

str.replace(re,"*");

但是如果有很多词要过滤,不能写成一整段,这样匹配不到,怎样把一个词一个词分开呢

|:或的意思

新的问题:所有敏感词都会替换成一颗星,怎样做到几个字几颗星呢?

replace()的第二个参数,可以是字符串,可以是回调函数

str.replace(re,function(){
 return '*';
});

现在和上面那句话作用一样

回调函数的第一个参数,就是匹配成功的字符,即可以通过第一个参数的长度,来给他返回几颗星

str.replace(re,function(str){
 var result='';
 for(var i=0;i<str.length;i++){
  result+='*';
 }
 return result;
});

四.正则表达式字符类

字符类:一组相似的元素(用[]表示[]的整体代表一个字符,()是分组和子项的意思)

1.任意字符

[abc]

如o[usb]t--obt、ost、out

2.范围

[a-z]、[0-9]

如id[0-9]--id0、id5

3.排除

[^a]

如o[^0-9]t--oat、o?t、o t

例子:过滤标签

过滤掉<>(如<div>、</div>、<h2 class="sfsdf">)

var re=/<[\w\W]+>/g;  //中括号里是或的关系,也就是字符或非字符都有了,包括了斜杠,引号等

另一种做法:    var re=/<[^>]+>/g;

五.正则表达式转义字符

.(点):任意字符       \.:真正的点

\s(\S):空格(非空格)

\d(\D):数字(非数字)

\w(\W):字符(非字符)   字符包括字母、数字、下划线

\数字:重复子项(\1:重复的第一个子项,\2:重复的第二个子项...)

var str="abca";
var re=/(a)(b)(c)\1/ ; //true,为什么不用var re=/(a)(b)(c)\a/ ;一样能匹配成功,\数字,用于不确定的子项字符
var re=/(a)(b)(c)\2/ ; //false
alert(re.teat(str));

例子:找某个字符串中出现最多的字符和它一共出现多少次

var str="vbbbbhybbfhbbgbbb";
var arr=str.split("");
str=arr.sort().join("");
var value=""; //存放出现最多的字符
var index=0; //存放次数
var re=/(\w)\1+/g;

没有\1,re就是一整个排好序的字符串,有了\1就是出现过的有重复的取出来像这样bbb...,hh

str.replace(re,function($0,$1){ //$0代表整体,$1代表第一个子项
 if(index<$0.length){ //$0:每一组重复的元素
  index=$0.length;
  value=$1;
 }
})
alert('出现最多的字符是'+value+',出现次数是'+index);

\b(\B):独立的部分(非独立的部分)  独立的部分(起始、结束、空格)

如:

var str="onetwo";
var re=/\bone/; //起始位置,true
var re=/one\b/; //false,要true,one和two之间加空格或者只有one
alert(re.test(str));

独立部分应用举例

之前有用到用封装好的函数来获取className

function getByClass(oparent,sClass){
 var aEle=oparent.getElementsByTagName("*");
 var aResult=[];
 var i;
 for(i=0;i<aEle.length;i++){
  if(aEle[i].className==sClass){
   aResult.push(aEle[i]);
  }
 }
 return aResult;
};

这个会有bug

<div class="box1"></div>
<div class="box1box2"></div>
<div class="box1 box2"></div>

用这个方法获取box1,只能获取到第一个

用正则来改写

function getByClass(oparent,sClass){
 var aEle=oparent.getElementsByTagName("*");
 var aResult=[];
 var i;
 var re=new RegExp('\\b'+sClass+'\\b')
 for(i=0;i<aEle.length;i++){
  if(re.test(aEle[i].className)){
   aResult.push(aEle[i]);
  }
 }
 return aResult;
};

六.量词

不确定的字符个数

量词:{}

{4,7}   最少出现4次,最多出现7次

{4,}     最少出现4次

{4}      正好出现4次

+是{}的简写,相当于(1,)

? 相当于{0,1}    //出现0次或者1次

* 相当于{0,}     //至少出现0次,可以没有

七.正则收尾

^:正则的最开始位置,表示起始的意思

$:正则的最后,表示结束的意思

例子:去掉字符串里的空格

var re=/^\s+|\s+$/g;
str.replace(re,"");

例子:检测邮箱

var re=/^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/;

八.前向声明和反前向声明

(?=) :前向声明

(?!):反前向声明

举例

var str="abacad";
var re=/a(?=b)/g;
str=str.replace(re,"*");
alert(str);

输出:*bacad

如果改为

var re=/a(?!b)/g;

输出:ab*c*d

Javascript 相关文章推荐
js 跨域和ajax 跨域问题小结
Jul 01 Javascript
jQuery get和post 方法传值注意事项
Nov 03 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
May 31 Javascript
jquery iframe操作详细解析
Nov 20 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
Mar 13 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
javascript入门之string对象【新手必看】
Nov 22 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
r.js来合并压缩css文件的示例
Apr 26 Javascript
javascript数组去重方法总结(推荐)
Mar 20 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
javascript中闭包概念与用法深入理解
Dec 15 #Javascript
javascript读取文本节点方法小结
Dec 15 #Javascript
EditPlus中的正则表达式 实战(4)
Dec 15 #Javascript
jQuery validate插件功能与用法详解
Dec 15 #Javascript
EditPlus 正则表达式 实战(3)
Dec 15 #Javascript
js实现点击每个li节点,都弹出其文本值及修改
Dec 15 #Javascript
EditPlus中的正则表达式 实战(2)
Dec 15 #Javascript
You might like
用PHP调用数据库的存贮过程
2006/10/09 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP安全的URL字符串base64编码和解码
2014/06/19 PHP
php实现求相对时间函数
2015/06/15 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
简单谈谈php延迟静态绑定
2016/01/26 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
2014/05/04 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
JS实现json的序列化和反序列化功能示例
2017/06/13 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
Vue仿今日头条实例详解
2018/02/06 Javascript
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
五四青年节优秀演讲稿范文
2014/05/28 职场文书
民事赔偿协议书
2014/11/02 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
python爬虫请求库httpx和parsel解析库的使用测评
2021/05/10 Python
浅谈Python响应式类库RxPy
2021/06/14 Python
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server