今天我们就来简单的复习一下 JavaScript
当中的正则表达式的一些内容,顺便记录记录,关于正则表达式,官网的说法是,正则表达式(regular expression
)描述了一种字符串匹配的模式(pattern
),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等
模式修饰符参数
如下
i
- 忽略大小写
g
- 全局匹配
m
- 多行匹配
/hello/
- 两个反斜杠是正则表达式的字面量表示法
两个测试方法
test
1 2 3
| const test = new RegExp('hello world', 'ig')
console.log(test.test('hello world'))
|
exec
返回的是数组,有就返回数组的值,没有返回为 null
1 2 3 4 5
| const test = new RegExp('hello world', 'ig')
console.log(test.exec('hello'))
console.log(test.exec('hello world'))
|
四个正则表达式方法
match(pattern)
将所有匹配的字符串组合成数组返回
1 2 3 4
| const pattern = /Box/ig const str = 'This is a Box! The is a box!'
console.log(str.match(pattern))
|
search(pattern)
返回字符串中 pattern
开始位置,『忽略全局匹配』
1 2 3 4
| const pattern = /Box/ig const str = 'This is a Box! The is a box!'
console.log(str.search(pattern))
|
replace(pattern)
替换匹配到的字符串
1 2 3 4 5
| const pattern = /Box/ig const str = 'This is a Box! The is a box!'
console.log(str.replace(pattern, 'Big box'))
|
split(pattern)
返回字符串指定 pattern
拆分数组
1 2 3 4 5
| const pattern = /\s/ig const str = 'This is a Box! The is a box!'
console.log(str.split(pattern))
|
匹配模式
有下面这些匹配模式
+
- 其前导字符必须在目标对象中连续出现一次或多次
*
- 其前导字符必须在目标对象中出现零次或连续多次
?
- 其前导对象必须在目标对象中连续出现零次或一次
\s
- 用于匹配单个空格符,包括 tab
键和换行符
\S
- 用于匹配除单个空格符之外的所有字符
\d
- 用于匹配从 0
到 9
的数字
\w
- 用于匹配字母,数字或下划线字符
\W
- 用于匹配所有与 \w
不匹配的字符
.
- 用于匹配除换行符之外的所有字符
^
- 定位符,规定匹配模式必须出现在目标字符串的开头(强制首匹配)
$
- 定位符,规定匹配模式必须出现在目标对象的结尾(强制尾匹配,并且只匹配一个)
\b
- 定位符,规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一
\B
- 定位符,则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾
/[A-Z]/
- 与从 A
到 Z
范围内任何一个大写字母相匹配
/[a-z]/
- 与从 a
到 z
范围内任何一个小写字母相匹配
/[0-9]/
- 与从 0
到 9
范围内任何一个数字相匹配
/([a-z][A-Z][0-9])+/
- 与任何由字母和数字组成的字符串,如 aB0
等相匹配
下面是一个示例
1 2 3 4
| const pattern = /^[a-z]oogle\d$/ const str = 'aoogle2'
console.log(pattern.test(str))
|
另外还有一些需要注意的地方
- 可以使用
()
把字符串组合在一起,()
符号包含的内容必须同时出现在目标对象中
- 如果希望实现类似编程逻辑中的『或』运算,在多个不同的模式中任选一个进行匹配的话,可以使用管道符
|
- 比如
/to|too|2/
,表示与目标对象中的 to
、too
或 2
相匹配
- 还有一个较为常用的否定符
[^]
,与之前的定位符 ^
不同,否定符 [^]
规定目标对象中不能存在模式中所规定的字符串
- 比如
/[^A-C]/
,表示将会与目标对象中除 A
,B
,和 C
之外的任何字符相匹配
- 一般来说,当
^
出现在 []
内时就被视做否定运算符,而当 ^
位于 []
之外,或没有 []
时,则应当被视做定位符
1 2 3 4 5
| const pattern = /baidu|google|bing/ const str = 'baidu a google'
console.log(pattern.test(str))
|
ES6 中正则表达式的扩展
在 ES5
当中,有下面两种情况
情况一
第一个参数是字符,第二个是修饰符
1 2 3 4
| let regex = new RegExp('xyz', 'i')
console.log(regex.test('xyz123')) console.log(regex.test('xyZ123'))
|
情况二
第一个参数是正则表达式,但是此时不接受第二个参数是一个修饰符,否则会报错
1 2 3 4 5
| let regex2 = new RegExp(/xyz/i) let regex3 = new RegExp(/xyz/i, 'i')
console.log(regex2.test('xyz123')) console.log(regex2.test('xyZ123'))
|
ES6
改变了此行为,第一个参数是正则表达式,第二个参数也可以在指定修饰符
1 2 3
| let regex3 = new RegExp(/abc/ig, 'i')
console.log(regex3.flags)
|
在以上示例中,原有正则对象的修饰符是 ig
,它会被第二个参数 i
覆盖
常用正则表达式
短横变驼峰
1 2 3 4 5 6 7 8
| var f = function (s) { return s.replace(/-\w/g, function (x) { console.log(x) return x.slice(1).toUpperCase() }) }
f('border-right-color')
|
千位分隔符
1 2 3 4 5 6 7 8 9 10
| function commafy(num) { return num && num .toString() .replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) { return $1 + ',' }) }
commafy(1234567.90)
|
解析 URL
1 2 3 4 5 6 7
| const getURLParameters = url => (url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce( (a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a), {} )
getURLParameters('https://www.baidu.com?id=123&name=zhangsan')
|
字符串大小写切换
1 2 3 4 5 6 7 8
| function caseConvert(str) { return str.replace(/([a-z]*)([A-Z]*)/g, (m, s1, s2) => { return `${s1.toUpperCase()}${s2.toLowerCase()}` }) }
caseConvert('abcdefg') caseConvert('ABCDEFG')
|
去空格
1 2 3 4
| str.replace(/\s*/g, '') str.replace(/^\s*|\s*$/g, '') str.replace(/^\s*/, '') str.replace(/(\s*$)/g, '')
|
去除所有的 html
1
| var con = content.replace(/<[^>]+>/g,'')
|
提取括号中的数值
1
| /\(([^()]+)\)/g.exec('add(18)')
|
匹配空行
检查邮政编码
1 2 3 4 5
| const pattern = /^[1-9]{1}[0-9]{5}$/ const str = '430000'
console.log(pattern.test(str))
|
检查压缩包后缀名
1 2 3 4 5
| const pattern = /^[\w]+\.(zip|gz|rar)$/ const str = 'a12_.zip'
console.log(pattern.test(str))
|
替换标签
将模版字符串包裹的内容使用 <code>
标签包裹起来,但是需要注意防止 XSS
,所以需要将 <script>
等标签过滤掉
1 2 3 4 5 6 7
| content .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'") .replace(/`([\S\s]+?)`/g, '<code>$1</code>')
|