正则表达式是解决字符串处理问题的利器,大部分替换、匹配字符串的问题都可以用正则表达式来解决。
正则表达式中常用元字符定义如下:
d 代表整数
B 代表非边界
D 代表非整数
w 是word的缩写,等价于[A-Za-z0-9_](匹配字母、数字、下划线、汉字 )
W匹配任意不是字母、数字、下划线、汉字的字符
s 代表空白字符
S 代表非空白字符
b 代表边界,匹配单词的开始或结束
[^x]代表除了x以外的任意字符
.匹配除换行符以外的任意字符^匹配字符串的开始$匹配字符串的结束
正则表达式中常用限定符定义如下:
*:出现零次或多次
?:出现一次或零次
+:出现一次或多次
{n}:出现n次
{n,}:至少出现n次
{n,m}:出现n次至m次
转义字符倾斜的方向:
而正则表达式的标识符方向为/
如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。
我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于w(如果只考虑英文的话)
用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。(d{1,3}.){3}d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:d{1,3}匹配1到3位的数字,(d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(d{1,3})。但为不匹配到256.300.888.999这种不可能存在的IP地址,只能使用冗长的分组,选择,字符类来描述一个正确的IP地址:((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)。
练习题:
1、这个表达式的结果是什么,为什么?
/dBDw{2}W{2}sSb/.test('1a_a(& s')
解答:
RegExp 对象方法——
(1)test() 方法用于检测一个字符串是否匹配某个模式.RegExpObject.test(string)
如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
调用 RegExp 对象 r 的 test() 方法,并为它传递字符串 s,与这个表示式是等价的:(r.exec(s) != null)。
(2)exec() 方法用于检索字符串中的正则表达式的匹配。返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
d B:以整数打头左边界——匹配1
D:非整数 ——匹配a
w:字母或数字或下划线或汉字, {2}代表前面的元字符出现两次——匹配_a
W{2}:非字母数字下划线汉字的字符出现两次——匹配(&
s :空白字符——匹配 空
Sb:以非空白字符结尾-右边界——匹配结尾s
故返回结果为true
2、请写一段代码,计算一个html文档标签个数(开始和结束标签算两个),要求使用到正则表达式匹配。例如以下匹配应该打印出:6
const html = `<div class='test'><b>Hello</b> <i>world!</i></div>`
解答:注意使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。用小括号来指定子表达式(也叫做分组),然后你就可以指定这个子表达式的重复次数了。
[]代表集合,^放在方括号中表示非 。
function length(param) {
var tag = /</?(w+)([^>]*)>/g
var match, arr = []
do {
if (match) arr.push(match)
match = tag.exec(param)
} while (match)
console.log(arr.length)
}
length(html)
拆解</?(w+)([^>]*)>如下:
< ——匹配html文档左标签的<
/? ——匹配/出现零次或一次
(w+) ——匹配字母数字word一次或多次
([^>]*) ——匹配除了>以外的任意字符出现零次或多次,意即匹配下一个>
前面的所有字符
> ——匹配>

3、写一个函数,将驼峰字符串转换成-分割字符串
解答:正则表达式与String.prototype.replace
结合处理字符串问题是非常强大的。$1
代表正则表达式()
中的引用值。例如:
var re = /(w+)s(w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1"); // 交换一个字符串中两个单词的位置console.log(newstr); // Smith, John
function conversion(str) {
return str.replace(/([A-Z])/g, '-$1').toLowerCase()
}
var camelCase = 'adminMasterList'
console.log(conversion(camelCase))

虽然题目没有明说,但是这种题目一定要用正则表达式来解决。使用for
循环来处理字符串虽然可以达到相同的效果,但是得分会无限接近于 0。
4、写一段正则要求匹配字符串:字母开头,后面字母数字下划线,长度6-30。
var reg = /^[a-zA-Z]w{5,29}$/
var str1 = 'e234_12'
var str2 = '_123sd'
console.log(reg.test(str1)) // true
console.log(reg.test(str2)) // false
5、解析url参数
解答思路:
(1)传统方式:查找location.search
(2)新API, URLSearchParams
(1)



function query(name) {
const search = location.search.substring(1)
// search: 'a=10&b=20&c=30'
const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`, 'i')
const res = search.match(reg)
if(res === null) {
return null
}
console.log(res)
return res[2]
}
var a = query('a')
console.log(a)
(2)新API, URLSearchParams
function query(name) {
const search = location.search
const p = new URLSearchParams(search)
return p.get(name)
}
var a = query('a')
console.log(a)

本文参考应用:
06 正则表达式-慕课专栏www.imooc.com正则表达式30分钟入门教程deerchao.cn快速搞定前端JavaScript面试-解析url参数coding.imooc.com