前端学习:正则表达式(RegExp)篇

2018-03-08  本文已影响0人  倒霉蛋儿_才才

正则表达式(Regular Expression,RegExp)相信对很多人来说,是一个‘熟悉的陌生人’。熟悉是因为我们知道他是很多语言不可缺少的一部分,而且很高效,但又会因为其相对复杂难记的规则而感到陌生!(总是以为记住了,到用时却。。。拼命翻书ing)但是作为一名合格的程序员,尤其前端程序员,需要经常处理一些字符串或者从文本中筛选一些信息,那么对正则的掌握必不可少!(我有什么办法,自己选的路,哭着也要学啊!啊!啊!)

image.png

1. 表达式结构和声明

正则表达式基本结构包括两部分,匹配规则和标识符,其中匹配规则包含在两个‘/’中,标识符在最后,形如/匹配规则/标识符


2. 表达式因子

所谓的匹配规则,便是有限个表达式因子的规则组合,组合规则当然要根据其功能来决定。主要的表达式因子及其含义如下,式中...代表需要填入的内容:

// RegExp
// 执行函数
function exec(reg,str){
    let result = reg.exec(str)
    console.log(result)
    return result
}
// 匹配以a开始的字符串
let reg = /^[a]/,
str1 = 'and',
str2 = 'but'
exec(reg,str1) // [ 'a', index: 0, input: 'acnd' ]
exec(reg,str2) // null
// 取反 匹配不以a开始的字符串
reg = /^[^a]/
exec(reg,str1) // null
exec(reg,str2) // [ 'b', index: 0, input: 'but' ]
// 匹配不以结尾的字符串
reg = /[^t]$/
exec(reg,str1) // [ 'd', index: 2, input: 'and' ]
exec(reg,str2) // null
// 下边来比较一下捕获分组与不可捕获分组的区别
let str  = 'Hello World!',
// 捕获分组
reg = /([a-z]+)\s([a-z]+)/i
let resultAry =exec(reg,str) // [ 'Hello World',  'Hello',  'World',  index: 0,  input: 'Hello World!' ]

// 插一句 获取分组结果的方式
// 方式1 数组索引 o为原始字符串,后续为分组
console.log(resultAry[1]) // 分组1:'Hello’
console.log(resultAry[2])  // 分组2:'World’

// 方式2 通过RegExp对象的'$索引'来获取,索引范围'1-9';但是这种方式需要在'reg.exec或test'后立即调用,或者字符串的`match、search、split`等方法
console.log(RegExp.$1) // 分组1:'input’
console.log(RegExp.$2)  // 分组2:'’
// 像这样才有效
reg.exec(str) 
console.log(RegExp.$1) // 分组1:'Hello’
console.log(RegExp.$2)  // 分组2:'World’

// 非捕获分组
reg = /(?:[a-z]+)\s(?:[a-z]+)/i
exec(reg,str) // [ 'Hello World', index: 0, input: 'Hello World!' ]
// 通过比较我们发现,非捕获分组确实不会返回字符串分组,即['Hello','World']

3. 举例分析:邮箱地址匹配

假设邮箱验证规则为:只允许英文字母、数字、下划线、英文句号、以及中划线组成,且下划线和中划线不得出现在开始和结束位置,区分大小写。

let reg = /^([a-zA-Z0-9]+[_\-]?[a-zA-Z0-9]+)@([a-zA-Z0-9]+[_\-]?[a-zA-Z0-9]+).([a-zA-Z]+)$/;

let email1 = '@hsajdh.com',
    email2 = '_dnaksl_@.com',
    email3 = '-absdbn_dnaksl_@hsajdh.',
    email4 = 'absdbn_dnaksl@hsajdh.com_',
    email5 = 'absdbn_dnaksl@hsajdh.com'

console.log(reg.test(email1)) // false
console.log(reg.test(email2)) // false
console.log(reg.test(email3)) // false
console.log(reg.test(email4)) // false
console.log(reg.test(email5)) // true

参考


如果您感觉有所帮助,或者有问题需要交流,欢迎留言评论,非常感谢!
前端菜鸟,还请多多关照!


上一篇 下一篇

猜你喜欢

热点阅读