正则括号的作用

看待前端开发工作 上海前端开发工作好找吗 前端开发工作时间

在正则中括号的作用可以总结为分组、选择、引用。
其中分组和选择相对比较简单,引用略显麻烦一点。
1.分组
比如我想找到字符串中连续出现的a,可以使用重复(量词)来匹配:
javascript 代码

var string = ‘abaaabaaa’
var result = string.match(/a+/g)
console.log(result)
//=>[“a”, “aaa”, “aaa”]

如果,我想匹配连续出现的ab呢?正则怎么写呢?
如写成ab+,是不对的。因为其表示一个字符a后面是至少一个的b。
此时我们需要把ab当做一个整体。此时括号出马。
如:
javascript 代码

var string = ‘abaaabababaaab’
var result = string.match(/(ab)+/g)
console.log(result)
//=>[“ab”, “ababab”, “ab”]

上面就是分组功能,把括号里的当做一个整体。提供一个子表达式。
括号的分组功能是十分好理解的。个人觉得几乎大多数语言中,括号基本用法都是这个。
2.选择
多选一的情形。比如我们要匹配abc中任意一个,可以用字符组:
javascript 代码

var string = ‘acdbcdcca’
var result = string.match(/[abc]c/g)
console.log(result)
//=>[“ac”, “bc”, “cc”]

此时也可以用选择:
javascript 代码

var string = ‘acdbcdcca’
var result = string.match(/(a|b|c)c/g)
console.log(result)
//=>[“ac”, “bc”, “cc”]

选择的通用结构是(…|…)
如果没有括号,那么就是把整个正则当做一个整体。
比如trim方法:
javascript 代码

var trim = function(string) {
    return (string || ”).replace(/^\s+|\s+$/g, ”)
}
var result = trim(‘ a b c ‘)
console.log(result.length)

整体是个选择结构。分成两个分支。其中/^\s+/匹配字符串开头连续的空白符,/\s+$/匹配字符串尾部连续的空白符。将匹配到的都替换为空字符。
3.引用(捕获)
引用分两种情况:引用匹配到的字符以及正则中的反向引用。
比如我要匹配一个日期(2016-06-07),正则怎么写呢?
一种豪放点写法是:/\d{4}-\d{2}-\d{2}/,只考虑是其组成是数字,
测试一下:
javascript 代码

var string = ‘2016-06-07’
var result = /\d{4}-\d{2}-\d{2}/.test(string)
console.log(result)
//=>true

如果想要提取里面的具体年、月、日怎么办?
可以通过分组以及正则api的配合。

比如使用match方法:
javascript 代码

var string = ‘2016-06-07’
var result = string.match(/(\d{4})-(\d{2})-(\d{2})/)
console.log(result)
//=>[“2016-06-07”, “2016”, “06”, “07”, index: 0, input: “2016-06-07”]

上述代码打印的结果中第2,3,4个元素就是我们想要的年月日。
正则变化成了/(\d{4})-(\d{2})-(\d{2})/,其中括号的另一个作用就是提供引用。

使用replace方法:
javascript 代码

var string = ‘2016-06-07’
var result = {}
string.replace(/(\d{4})-(\d{2})-(\d{2})/, function(match, year, month, date) {
    if (year) result[‘year’] = year
    if (month) result[‘month’] = month
    if (date) result[‘date’] = date
    return match
})
console.log(result)
//=>Object {year: “2016”, month: “06”, date: “07”}

使用exec方法
javascript 代码

var string = ‘2016-06-07’
var result = /(\d{4})-(\d{2})-(\d{2})/.exec(string)
console.log(result)
//=>[“2016-06-07”, “2016”, “06”, “07”, index: 0, input: “2016-06-07”]

获取子表达式匹配的内容也用$1,$2,…来表示:
javascript 代码

var string = ‘2016-06-07’
var result = string.replace(/(\d{4})-(\d{2})-(\d{2})/, ‘$1年$2月$3日’)
console.log(result)
//=>2016年06月07日
console.log([RegExp.$1, RegExp.$2, RegExp.$3])
//[“2016”, “06”, “07”]

关于引用,有时也需要在正则中使用,即反向引用。
关于日期,有很多种表示,比如:2016-06-07、2016.06.07、2016/06/07
如果想写一个正则同时匹配上述三种,最初的写法可能是:
/\d{4}[-.\/]\d{2}[-.\/]\d{2}/ 因为,“-”,“.”,“/”都是元字符,因此要在分组中加反斜杠。
上述三种情况,这么写的表达式,上述三种情况都能匹配的,测试如下:
javascript 代码

var reg = /\d{4}[\-\.\/]\d{2}[\-\.\/]\d{2}/
console.log(reg.test(‘2016-06-07’)) //=>true
console.log(reg.test(‘2016.06.07’)) //=>true
console.log(reg.test(‘2016/06/07’)) //=>true
console.log(reg.test(‘2016-06/07’)) //=>true

同时我们也注意到’2016-06/07’这样的格式也能匹配,我们希望的是前后能保持一致。因此要是使用反向引用。
正则改成如下:/\d{4}([-.\/])\d{2}\1\d{2}/
其中\1表示,正则中的第一个子表达式(即第一个括号)里匹配到的内容。
测试如下:
javascript 代码

var reg = /\d{4}([\-\.\/])\d{2}\1\d{2}/
console.log(reg.test(‘2016-06-07’)) //=>true
console.log(reg.test(‘2016.06.07’)) //=>true
console.log(reg.test(‘2016/06/07’)) //=>true
console.log(reg.test(‘2016-06/07’)) //=>false

当然,本例不使用分组,使用选择结构也是可以的
javascript 代码

var reg = /\d{4}(\-|\.|\/)\d{2}\1\d{2}/
console.log(reg.test(‘2016-06-07’)) //=>true
console.log(reg.test(‘2016.06.07’)) //=>true
console.log(reg.test(‘2016/06/07’)) //=>true
console.log(reg.test(‘2016-06/07’)) //=>false

\1我们明白了,\2呢?不用多说。

括号的总体作用说完了。最后说一下非捕获分组。
javascript 代码

var reg = /(?:\d{4})(\-|\.|\/)\d{2}\1\d{2}/
console.log(reg.test(‘2016-06-07’)) //=>true
console.log(reg.test(‘2016.06.07’)) //=>true
console.log(reg.test(‘2016/06/07’)) //=>true
console.log(reg.test(‘2016-06/07’)) //=>false

使用(?:)表示此括号只是提供分组功能,不提供引用功能。因此\1不用改成\2。

前端开发工作去哪里找 前端开发工作总结 web前端开发工作流程

» 本文来自:前端开发者 » 《正则括号的作用》
» 本文链接地址:https://www.rokub.com/5833.html
» 您也可以订阅本站:https://www.rokub.com
赞(0)
64K

评论 抢沙发

评论前必须登录!