分组
在使用正则的时候, 有时候会想要匹配一串字符串连续出现多次的情况, 比如: 我想匹配字符串 Byron 连续出现 3 次的情况.
有些人会直接写:
Byron{3}
但是, 这种情况仅仅会匹配 Byro 加上三个 n, 显然, 这样是错误的.
要想实现之前的需求, 我们需要使用正则表达式的分组功能: 使用 () 可以达到分组的功能, 使量词作用于分组. 所以, 如下正则可以顺利匹配 Byron 三次
(Byron){3}
或
JS 中的 | 的含义是或, 在正则中, 我们也可以使用 | 达成或的效果. 比较常用的或的写法是:
Byron | Casper
即, Byron 或 Casper 二选一.
还有一种用法是配合分组使用:
- let text = 'ByronsperByrCasper'
- let reg = /Byr(on|Ca)sper/g // 匹配 Byronsper 或 ByrCasper
- text.replace(reg, 'X') // XX
反向引用
此时, 我们有一个需求, 将一种格式的时间字符串: yyyy-MM-DD 转为 MM/DD/yyyy 类型格式字符串.
这个问题的难点在于, 不仅要将 - 转为 / 还要将年月日的位置进行调换. 由于年月日的数值是不固定的, 没法直接转换为固定数值. 这时, 我们可以使用反向引用解决这个问题.
反向引用是分组中的一个重要的高级语法, 主要用来解决分组变量的问题.
什么叫分组变量? 分组变量就是通过分组匹配到的值, 正则表达式将其转为了一种可以被调用的变量. 而调用这个变量也很简单 $nn 代表着分组的序号, 值得一提的是, 序号是从 1 开始, 而不是从 0 开始.
通过反向引用可以很轻松的解决上面那个问题:
- let text = '2018-07-09'
- let reg = /(\d{4})-(\d{2})-(\d{2})/g
- /*
- $1 是 (\d{4}) 的匹配内容, 代表 yyyy
- $2 是第一个 (\d{2}) 的匹配内容, 代表 MM
- $3 是第二个 (\d{2}) 的匹配匹配内容, 代表 DD
- */
- text.replace(reg, '$2/$3/$1') // 07/09/8
忽略分组
当不希望捕获某些分组, 只需要在分组内加上?: 即可以
(?:Byron).(ok)
JS 正则表达式从入门到入土(7)-- 分组
来源: http://www.bubuko.com/infodetail-2677750.html