RegExp
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串
常见的正则表达式
- matchPositiveInteger:
/^[^0 | -]([0-9]?)+$/
- matchFloat:
/^(([1-9]\d*)|0)(\.\d{0,20})?$/
- formatCommaNumber : Number(num).toString().replace(new RegExp(/(?<=-?\d)(?=(\d{3})+(.{1}\d+)?$)/,’g’), ‘,’) // 8432957983475934.333 => 8,432,957,983,475,934.333(不兼容 Safari)
- matchPointNumber: ` /^\d+(.\d{1,2})?$/`
使用正则表达式的方法
方法 |
描述 |
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 || '')
}