fat-cat

RegExp

正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串

常见的正则表达式

使用正则表达式的方法

方法 描述
exec 一个在字符串中执行查找匹配 RegExp 方法,返回一个数组,未匹配到则返回 null
test 一个在字符串中测试是否匹配 RegExp 方法,返回一个数组,未匹配到则返回 null
match 一个在字符串中执行查找匹配String方法,返回一个数组,未匹配到则返回 null

正则表达式中的特殊字符

字符 含义
. (小数点)匹配除换行符之外的任何单个字符
[xyz] 字符集合,匹配方括号中的任意字符
[^xyz] 反向字符集合,匹配任何没有包括方括号中的字符
* 匹配前一个表达式 0 次到多次(0~多) => {0,} (这里的前一个表达式可以理解成前一个字符或者一个子正则表达式) >
+ 匹配前一个表达式 1 次到多次(1~多) => {1,}
? 匹配前一个表达式 0 次到 1 次(0~1) => {0,1} ,如果紧跟在任何两次 ×、+、?或{}后面,将会使量词变为非贪婪的(匹配尽量少的字符)
| 或者
\d 匹配数字中的一个, => [0-9]
\D 匹配非数字中的一个, => [^0-9]
\s 空白符
\S 非空白符
\w 单字字符,如字母、数字和下划线
\W 非单字字符,如@#
^ 取反,开始标志
$ 结束标志
\b 匹配一个单词边界,即字与空格键的位,两边只要没有数字,字母,汉字,下划线,如 here is a word,这句话中有好几个\b 置
\B 非单词边界
(x) 捕获括号,会匹配 ‘x’ 并且记住匹配项, js 中 split 使用捕获括号将匹配结果包含在返回的数组中
?:exp 匹配 exp 但不记住这个匹配项,非捕获括号,例如 “industr(?:y|ies)”就是一个比“industry | industries”更简略的表达式
?=exp 先行断言,例如,x(?=y),匹配’x’仅仅当’x’后面跟着’y’;又例如,/Jack(?=Sprat)/ 会匹配到 ‘Jack’ 仅当它后面跟着’Sprat’
?<=exp 后行断言,例如,(?<=y)x, 匹配 ‘x’ 仅当 ‘x’ 前面是 ‘y’;例如,/(?<=Jack)Sprat/会匹配到’ Sprat ‘仅仅当它前面是’ Jack’,不兼容 Safari
?!exp 正向否定查找,例如,x(?!y), 仅仅当 ‘x’ 后面不跟着 ‘y’ 时匹配 ‘x’;又例如,仅仅当这个数字后面没有跟小数点的时候,/\d+(?!.)/ 匹配一个数字。正则表达式/\d+(?!.)/.exec(“3.141”)匹配‘141’而不是‘3.141’
?<!exp 反向否定查找,例如,(?<!y)x, 仅仅当 ‘x’ 前面不是 ‘y’ 时匹配 ‘x’;又例如, 仅仅当这个数字前面没有负号的时候,/(?<!-)\d+/ 匹配一个数字。 /(?<!-)\d+/.exec(‘3’) 匹配到 “3”;/(?<!-)\d+/.exec(‘-3’) 因为这个数字前有负号,所以没有匹配到。不兼容 Safari

示例

    '2018-8-8'.replace(/\b(\w)\b/g, '0$1') // '2018-08-08'

    '20180323'.replace(/^(\d{4})(\d{2})(\d{2})$/g, '$1-$2-$3' ) // '2018-03-23'

    '质检任务列表页质检任务列表页'.split(new RegExp('('+'检'+')', 'ig')) // ["质", "检", "任务列表页质", "检", "任务列表页"]

    '质检任务列表页质检任务列表页'.split(new RegExp('('+'质'+')', 'ig')) // ["", "质", "检任务列表页", "质", "检任务列表页"]

将’get-element-by-id’转换成‘getElementById’

 // 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。
 'get-element-by-id'.replace(/\-(\w)/g, (match, p) => p.toUpperCase())

 'get-element-by-id'.replace(/\-([a-z])/g, (match, p) => p.toUpperCase())

将’getElementById’转换成’get-element-by-id’

 'getElementById'.replace(/[A-Z]/g, (match, p) => '-' + match.toLowerCase())

转义特殊字符

const reRegExpChar = /[\\^.*+?()[\]{}|]/g
const reHasRegExpChar = RegExp(reRegExpChar.source) // /[\\^.*+?()[\]{}|]/

const escapeRegExp = (str) => {
    return str && reHasRegExpChar.test(str) ? str.replace(reRegExpChar, '\\$&') : (str || '')
}