正则表达式

  • 关键词:正则表达式

我的理解:明确目的规则,了解正则字符含义,拼凑正则规则模板,就像作者写文章

 1. 正则表达式,又称规则表达式。计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
 2. 正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。
 3. 所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

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

符号 含义 备注
\d 预定义类:数字字符,包括:数字 [0-9]
\w 预定义类:单词字符,包括:字母、数字、下划线 [a-zA-Z_0-9]
\s 预定义类:空白符 [\t\n\x0B\f\r]
[a-zA-Z0-9] 范围类:包括:字母、数字
. (点) 元字符:除了换行和回车之外的任意字符 [^\n\r]
* 量词:出现零次或多次(任意次)
+ 量词:出现一次或多次(至少出现一次)
? 量词:出现零次或一次(最多出现一次)
x{3} 量词:匹配 出现 3 次的 x
\b 边界:单词边界 与\B相反
^ 边界:以xxx开头
$ 边界:以xxx结尾

2. 编写函数trim(str),功能:去除字符串两边的空白字符

  • 思路
 1. 要求:删除开头结尾的空白字符
 2. 匹配:匹配开头结尾的空白字符  // 开头^; 空白字符\s; 出现任意次*; 或|; 结尾$; 
 3. 替换:替换掉匹配到的空白字符  // str.replace(x, y)
  • 代码
function trim(str){
    var deleteBlank = /^\s*|\s*$/g;  // 正则匹配筛选
    var back = str.replace(deleteBlank, '');  // 字符串替换去除
    return back;
}
var result1 = trim(' dd   dd dd   ');
var result2 = trim('   ddd ddd  dd');
console.log(result1);  // dd   dd dd
console.log(result2);  // ddd ddd  dd

3. 编写函数isEmail(str),功能:判断用户输入的是不是邮箱

  • 思路
 1. 要求:确定邮箱格式:[email protected](对比163的部分规则)
 2. 建造:根据要求建立规则模式
 3. 判断:用户输入格式是否符合要求
 4. 反馈:合法格式——提示:‘欢迎回来!’;非法格式——提示:‘邮箱输入错误!’
 5. 防火,防盗,放拼写错误!
  • 代码
function isEmail(str){
    var emailFormat = /^[a-zA-Z]\w{5,17}@\w+\.[a-z]{2,4}$/g;
    var back = emailFormat.test(str);  // 注意 test 的拼写,不要错写为 text
    if(back === true){
        return '欢迎回来!';
    }else {
        return '邮箱输入错误!';
    }
} 
var result1 = isEmail('[email protected]');
console.log(result1);  // 欢迎回来!
var result2 = isEmail('[email protected]');
console.log(result2);  // 邮箱输入错误!

4.编写函数isPhoneNum(str),功能:判断用户输入的是不是手机号

  • 思路
 1. 要求:确定手机号码格式:1xxxxxxxxxx 【2. 3. 略——翻看第2题】
 4. 反馈:合法格式——提示:‘欢迎回来!’;非法格式——提示:‘手机号码输入错误!’
  • 代码
function isPhoneNum(str) {
    var num = /^1\d{10}$/;
    var back = num.test(str);
    if(back === true){
        return '欢迎回来!';
    }else {
        return '手机号码输入错误!';
    }
}
var result1 = isPhoneNum('18966668888');
console.log(result1);  // 欢迎回来!
var result2 = isPhoneNum('6896666');
console.log(result2);  // 手机号码输入错误!

5. 编写函数isValidUsername(str),功能:判断用户输入的是不是合法的用户名

  • 思路
 1. 要求:用户名格式:长度6-20个字符,只能包括字母、数字、下划线 
 4. 反馈:合法格式——提示:‘用户名输入正确!’;非法格式——提示:‘用户名输入错误!’
  • 代码
function isValidUsername(str){
    var username = /^\w{6,20}$/g;
    var back = username.test(str);
    if(back === true){
        return '用户名输入正确!';
    }else {
        return '用户名输入错误!';
    }
}
var result1 = isValidUsername('Teemo');   // 萌神提莫
console.log(result1);  // 用户名输入错误!
var result2 = isValidUsername('Ezreal');  // 伊泽瑞尔
console.log(result2);  // 用户名输入正确!

6. 编写函数isValidPassword(str),功能:判断用户输入的是不是合法密码

  • 思路
 1. 要求:用户名格式:长度6-20个字符,只包括大写字母、小写字母、数字、下划线,且至少至少包括两种 
 4. 反馈:合法格式——提示:‘密码正确!’;非法格式——提示:‘密码错误!’
  • 代码
function isValidPassword(str) {
    if(!/^\w{6,20}$/g.test(str)) return '密码格式错误';  // 非 \w{6,20} 错误
    if(/^\d{6,20}$/g.test(str)) return '密码格式错误';  // 全是数字 错误
    if(/^[a-z|A-Z]{6,20}$/g.test(str)) return '密码格式错误';  // 全是字母错误
    if(/^_{6,20}$/g.test(str)) return '密码格式错误';  // 全是下划线错误
    return '密码格式正确';  // 其他正确
}
var result1 = isValidPassword('mima666');
console.log(result1);  // 密码格式正确
var result2 = isValidPassword('wodemima');
console.log(result2);  // 密码格式错误
var result3 = isValidPassword('mima');
console.log(result3);  // 密码格式错误

7. 编写正则表达式,功能:得到如下字符串里所有的颜色

  • 思路
 1. 要求:颜色格式—— #xxxxxx (16进制颜色)
 2. 建造:根据要求建立模式规则
 3. 筛选:匹配颜色字符,得到结果
  • 代码
/*var re = 正则补全*/
var re = /#[0-9a-fA-F]{6}|#[0-9a-fA-F]{3}!\w$/g;
var subj = "color: #121212; background-color: #AA00ef; width: 12px; bad-colors: f#fddee "
console.log( subj.match(re) )  // ['#121212', '#AA00ef']

8.1 下面代码输出什么? 为什么?

var str = 'hello  "hunger" , hello "world"';
var pat =  /".*"/g;
str.match(pat);
  • 输出:" "hunger", hello "world" "
  • 原因:
 1. 结果以字符串中出现的:第一个引号作为开始,最后一个引号作为结束 ———— 进行匹配划分
 2. 首先匹配引号,并将引号作为字符串的开头 "和结尾(不懂正则解析规则)"
 3. ' .* ' 相当于 任意字符{0,∞} ,贪婪模式下会按照无穷大进行匹配 
 4. 正则表达式默认处于贪婪模式(并未触发其非贪婪模式,使用 ‘?’ 即可触发)
 5. 贪婪模式:按规定的最大值进行匹配
 6. 非贪婪模式:按规定的最小值进行匹配

8.2 改写代码,让其输出["hunger", "world"]

  • 思路
 1. 两个字符串都以 引号 作为开头和结尾:即见到 引号 就作为开头和结尾进行划分
 2. 应该触发其非贪婪模式:按照最小值进行匹配
 3. 非贪婪模式:使用 ‘?’ 触发,如下
  • 代码改写
var str = 'hello  "hunger" , hello "world"';
var pat =  /".*?"/g;
str.match(pat);
  • 此时输出:" "hunger", "world" "

本文章著作权归饥人谷和作者所有,转载须说明来源!

你可能感兴趣的:(正则表达式)