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

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

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

Js笔试题之正则表达式的更多相关文章

  1. 所在实习公司的JS笔试题

    在班上无聊的时候看到了一份JS笔试题(我是电面进去的,没做过这份题~~),开始还觉得蛮简单......后来觉得还是很有意思的,贴出来一起看看. 题目一: if(!("a" in w ...

  2. 2016 JS 笔试题汇总:

    1 1 1 CS&S(中软国际): 1 JavaScript 循环表达式: 2  JavaScript表达式boolean返回值: 3 网页中的事件/HTML 事件属性/JavaScript ...

  3. Js笔试题之千分位格式化

    用js实现如下功能,将给定的数字转化成千分位的格式,如把“10000”转化成“10,000”,并考虑到性能方面的因素. 一.首先想到的办法,将数字转换为字符串(toString())再打散成数组(sp ...

  4. js笔试题一套(未完待续)

    1.下面程序的运行结果是: function test(x, y, z) { alert(test.length); alert(arguments.length); alert(arguments. ...

  5. 容易答错的JS笔试题

    1,考察this var length = 10 function fn(){     alert(this.length) } var obj = {     length: 5,     meth ...

  6. 蛮考验基础的JS笔试题(有坑小心!)

    1.  考察this var length = 10 function fn(){ alert(this.length) } var obj = { length: 5, method: functi ...

  7. JS笔试题

    JS 引用相关题目 以下代码输出什么? 为什么? var a = {n:1}; var b = a; a = {n:2}; a.x = a ; console.log(a.x); console.lo ...

  8. Js笔试题之返回只包含数字类型的数组

    如js123ldka78sdasfgr653 => [123,78,653] 一般做法 分析: 1.循环字符串每个字符,是数字的挑出来拼接在一起,不是数字的,就给他空的拼个逗号 2.将新字符串每 ...

  9. Js笔试题之parseInt()和.map()

    parseInt()的几个例子 var b = parseInt("01"); alert("b="+b); var c = parseInt("09 ...

随机推荐

  1. [转]瓦的VPS后台kiwivm面板使用+安装AMH+装VPN

    参考网址:http://u-lis.com/archives/4159 ZC:网页图片保存于“百度云 OsSkill --> 全部文件 > 知识__来自网页 > 瓦 > 瓦_面 ...

  2. html5 的draggable属性使用<转载收藏>

    在HTML5中,已经支持在浏览器与其他应用程序之间的数据互相拖动,同时也大大简化了有关于拖放方面的代码. 实现拖放的步骤 在HTML5中要想实现拖放操作,至少要经过两个步骤: 将想要拖放的对象元素的d ...

  3. django的安装和搭建

    一.先下载pyton,配置下python的环境变量,这个很重要,然后下载django,解压到与python同一个根目录底下,进入django目录,运行python setup.py install安装 ...

  4. maven setting.xml配置说明

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  5. JavaWeb 4 XML

    4 XML 1 XML入门        1.1 引入        HTML: 负责网页的结构            CSS: 负责网页的样式(美观)        Javascript: 负责在浏 ...

  6. 【Oracle 数据迁移】环境oracle 11gR2,exp无法导出空表的表结构【转载】

    今天做数据迁移,但是发现有些空表无法exp,后来找到问题所在. [原文]:http://www.cnblogs.com/wenlong/p/3684230.html 11GR2中有个新特性,当表无数据 ...

  7. shell远程执行命令

    ssh主要参数说明 -l 指定登入用户 -p 设置端口号 -f 后台运行,并推荐加上 -n 参数 -n 将标准输入重定向到 /dev/null,防止读取标准输入 -N 不执行远程命令,只做端口转发 - ...

  8. phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

    制作简单的acl, dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等) ...

  9. Selenium解决页面元素不在视野范围内的问题

    当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...

  10. 慎用GetOpenFileName

    这两天发现了一个小问题,经过一上午的排查终于找到了问题的原因--Windows 7的API函数GetOpenFileName竟然有BUG! 请参考下面的MFC代码: CFileDialog dlg(T ...