21.正则表达式

问答

一、\d,\w,\s,[a-zA-Z0-9],\b,.,*,+,?,x{3},^$分别是什么?

  • \d:匹配数字字符,等价于[0-9],(digit数字缩写)


    Paste_Image.png
  • \w:匹配单词字符,字母、数字下划线,等价于[a-zA-Z_0-9],(word缩写)


    Paste_Image.png
  • \s:匹配空白字符(空格 回车 tab 换行)(space缩写)


    Paste_Image.png
  • [a-zA-Z0-9]匹配a到z,A到Z,0到9之间的任意字符


    Paste_Image.png
  • \b匹配单词边界(boundary缩写)


    Paste_Image.png
  • “.”匹配单个字符,除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。


    Paste_Image.png
  • “*”出现零次或多次(任意次)


    Paste_Image.png
  • +出现一次或多次(至少出现一次)


    Paste_Image.png
  • ?出现零次或一次(最多出现一次)


    Paste_Image.png
Paste_Image.png
  • x{3}:匹配x出现三次


    Paste_Image.png
  • ^:以...开头;在[ ]中是类的取反,比如[^abc]表示取不包含abc中的任意一个字符串


    Paste_Image.png
Paste_Image.png
  • $:以...结尾


    Paste_Image.png

二、贪婪模式和非贪婪模式指什么?

1.贪婪模式是尽可能多的匹配,即匹配直到下一个字符不满足匹配规则为止。{n,m}、+、*在默认情况下都是贪婪模式。

'123456789'.match(/\d{3,5}/g); //["12345", "6789"]

2.非贪婪模式是尽可能少的匹配,即一旦条件满足,就不再往下匹配。在末尾加上?代表非贪婪模式。

'123456789'.match(/\d{3,5}?/g); //["123", "456", "789"]
Paste_Image.png

代码题

一、写一个函数trim(str),去除字符串两边的空白字符

方法一:

function trim(str){
    return str.replace(/^\s+|\s+$/g,"");
};
trim(" hello world ");
Paste_Image.png

方法二:

function trim(str){
      return str.match(/\S+.+\S/);
}
trim(" hello world ");
Paste_Image.png

二、用实现 addClass(el, cls)、hasClass(el, cls)、removeClass(el,cls),使用正则

function hasClass(el, cls){ 注意:(\\s|^)和(\\s|$)表示左边是开头或者空格,右边是结尾或者空格
    var reg = new RegExp('(\\s|^)'+ cls +'(\\s|$)','g');
    return reg.test(el.className)
}

function addClass(el,cls){
    if(!reg.test(el.className)){
        return el.className+" "+cls;
    }

function removeClass(el,cls){
    if(reg.test(el.className)){
        return el.className.replace(cls,"");
    }
}

var el={
    className:"hello jirengu"
}
Paste_Image.png

三、写一个函数isEmail(str),判断用户输入的是不是邮箱

function isEmail(str){
    var reg = /^[\w\.-]+@{1}[\w-]+\.[\w\.-]+$/;
    return reg.test(str);
}
Paste_Image.png

四、写一个函数isPhoneNum(str),判断用户输入的是不是手机号

function isPhoneNum(str){
    return /^1[3-8](\d){9}$/.test(str)
}
Paste_Image.png

五、写一个函数isValidUsername(str),判断用户输入的是不是合法的用户名(长度6-20个字符,只能包括字母、数字、下划线)

function isValidUsername(str){
    return /^\w{6,20}$/.test(str);
}
Paste_Image.png

六、写一个函数isValidPassword(str), 判断用户输入的是不是合法密码(长度6-20个字符,包括大写字母、小写字母、数字、下划线至少两种)

function isValidPassword(str){
    if(/^\S{6,20}$/.test(str)){
       if(/^[a-z]*$|^[A-Z]*$|^\d*$|^\_*$/.test(str)){
          return '不合法密码'; 
       }else{
           return '合法密码';
       };
    }
    else{
        return false;
    };
}

方法二:

function isValidPassword(str){
    var reg = new RegExp ( '^\\S{6,20}$' ); //注意此处不能写成\w,否则无法通过第一个测试样例
    if(reg.test(str)){
        var count = 0;
        if(/\d/.test(str)){count++;}
        if(/[A-Z]/.test(str)){count++;}
        if(/[a-z]/.test(str)){count++;}
        if(/[_]/.test(str)){count++;}
    }
    if(count>1){return true;}
    else{return false;}
}
isValidPassword("hello'11111'");// true
isValidPassword("'0123'0123"); // false
isValidPassword("AAAaaa"); //true

七、写一个正则表达式,得到如下字符串里所有的颜色(#121212)

var re = /*正则...*/

var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "

alert( subj.match(re) )  // #121212,#AA00ef
var re=/#[a-fA-F0-9]{6}|#[a-fA-F0-9]{3}/gi
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee #fd2 "
console.log( subj.match(re) ) 
Paste_Image.png

八、下面代码输出什么? 为什么? 改写代码,让其输出hunger, world

var str = 'hello  "hunger" , hello "world"';
var pat =  /".*"/g;  
str.match(pat); 

输出结果:


Paste_Image.png

因为:首先开始匹配“符号,然后到了“.”符号,它是除了回车符和换行符之外的所有单个字符,这里它可以匹配引号,空格,“”符号是代表0个或多个,它默认是贪婪模式,所以“.”匹配到不能匹配为止,也就是匹配到hunger” , hello “world”。然后正则表达式里面还要匹配“符号,所有要回溯,刚好当前的位置就是”符号。

可以通过加上?变为非贪婪模式

var pat = /".*?"/g;
var c = str.match(pat);
for (var i in c){
    c[i] = c[i].replace(/["]/g,'');  // 去掉字符串的双引号
}
console.log(c); 
Paste_Image.png

如果要用贪婪模式,还可以这样

var pat = /["]\w*["]/g;
var c = str.match(pat);
for (var i in c){
    c[i] = c[i].replace(/["]/g,'');  //去掉字符串的双引号
}
console.log(c); 
Paste_Image.png

九、补全如下正则表达式,输出字符串中的注释内容. (可尝试使用贪婪模式和非贪婪模式两种方法)

str = '.. <!-- My -- comment \n test --> ..  <!----> .. '
re = /.. your regexp ../

str.match(re) // '<!-- My -- comment \n test -->', '<!---->'

贪婪模式

str = '.. <!-- My -- comment \n test --> ..  <!----> .. '
re = /<!--[^>]*-->/g;

str.match(re);

打印结果:


Paste_Image.png

非贪婪模式

str = '.. <!-- My -- comment \n test --> ..  <!----> .. '
re = /<!--[\W\w]*?-->/g;

str.match(re);

打印结果:


Paste_Image.png

十、补全如下正则表达式

var re = /* your regexp */

var str = '<> <a href="/"> <input type="radio" checked> <b>'
str.match(re) // '<a href="/">', '<input type="radio" checked>', '<b>'

贪婪模式

var re = /<[^>]+>/g

var str = '<> <a href="/"> <input type="radio" checked> <b>'
str.match(re);

打印结果:


Paste_Image.png

非贪婪模式

var re = /<[^>]+?>/g;

var str = '<> <a href="/"> <input type="radio" checked> <b>'
str.match(re);

打印结果:


Paste_Image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容