问题一

JavaScript 写一个字符串转成驼峰的方法,o_div_style_position转成oDivStylePosotion。

1
2
3
4
5
var str = 'border-bottom-color';
var strRg = str.replace(/\-[a-z]/g, function (params) {
return params.charAt(1).toUpperCase();
})
console.log(strRg);
  1. charAt(1)也可以用substr(1)、substring(1)来替代。
  2. toUpperCase()转换成大写字母。
  3. /-[a-z]/g中g表示全文检索,part表示匹配到的字符
  4. replace是字符串的方法,返回经过修改的新字符串。

问题二

JavaScript 查找字符串中出现最多字符的个数
例如:sdjksfssscfssdd ->字符最多的是s,出现了7次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var str = 'sdjksfssscfssdd';
var maxObj = {
key: null,
count: null
};
var maxCou = 0;
while (str) {
var i = 0;
var reg = new RegExp(str[0], 'g');
var currStr = str[0];
str = str.replace(reg, function (part) {
i++;
return '';
})
if (i > maxCou) {
maxObj.key = currStr;
maxCou = maxObj.count = i;
}
}
console.log(maxObj.key + ':' + maxObj.count)

问题三

JavaScript 把12233435566690中连续重复的数字去掉

判断是否为空字符串,是就直接返回;

不是的话

初始字符串为str第一个,从第二个开始,如果不等于他们前一个的字符,代表不重复,加入初始字符,迭代进行,直到最后一个,返回

1
2
3
4
5
6
7
8
9
10
11
12
13
function removeRepetition (str) {
if (str != '') {
var result = str[0];
for (var i = 1; i < str.length; i++) {
if (str[i] != str[i - 1]) {
result += str[i];
}
}
}
else result = '';
return result;
}
console.log(removeRepetition("sssssssssaaaaaaaaasasas")); //sasasas

问题四

JavaScript 用js实现千位分隔符?

例如123456789–>123,456,789

1
2
3
4
5
6
var str = '123456789';
var reg = /^([1-9]\d{0,2})((?:\d{3})+)$/;
var s = str.replace(reg, function () {
return RegExp.$1 + ',' + RegExp.$2.match(/\d{3}/g);
})
console.log(s);//123,456,789

知识点

  • 将第一个逗号前面的数字作为第一组,后面所有数字为第二组,第二组是由多个三位的数字组合而成的,整体需要匹配捕获,但是每个三位数不需要匹配捕获所以加?:。
  • RegExp.$1获取第一个分组,RegExp.$2获取第二个分组。
  • match返回匹配到的数据,是数组类型。

注意:IE10中直接调用分组不识别,需要在此前调用test方法:

1
2
3
4
5
6
7
8
var str = '123456789';
var reg = /^([1-9]\d{0,2})((?:\d{3})+)$/;
if (reg.test(str)) {
var s = str.replace(reg, function () {
return RegExp.$1 + ',' + RegExp.$2.match(/\d{3}/g);
})
}
console.log(s);//123,456,789

问题五

JavaScript 写一个正则表达式判断字符串是否是对称数

1
2
3
4
5
var str = 'Woow';
var reg = /^([a-z])([a-z])\2\1$/i;
if (reg.test(str)) {
console.log('ok')
}

问题六

JavaScript 写出一个正则表达式用于匹配由数字和字母组成的字符串

1
2
3
4
5
6
7
8
function checkPassWord (nubmer) {
var re = /^[0-9a-zA-Z]*$/; //判断字符串是否为数字和字母组合
if (!re.test(nubmer)) {
return false;
} else {
return true;
}
}



test() 也能捕获(本意是匹配)

1
2
3
4
5
6
7
8
9
var str = "wzg123wzg45wzg52";
var reg = /(\d+)/g;

console.log(reg.test(str));
console.log(RegExp.$1);
console.log(reg.test(str));
console.log(RegExp.$1);
console.log(reg.test(str));
console.log(RegExp.$1);

在这里插入图片描述


案例:把时间字符串进行处理

1
2
3
var time = "2020-5-1";
var reg = /(\d{4})-(\d{1,2})-(\d{1,2})/;
time = time.replace(reg, "$1年$2月$3日");

也可以这样处理str.replace(reg,function(){})

  1. 首先拿REG和TIME进行匹配捕获,能匹配到几次就会把传递的函数执行几次(而且是匹配一次就执行一次)
  2. 不仅把方法执行,而且EWPLACE还给方法传递了实参信息(和exec捕获的内容一致的信息:大正则匹配的内容,小分组匹配的信息)
1
2
3
4
5
var time = "2020-5-1";
var reg = /(\d{4})-(\d{1,2})-(\d{1,2})/;
time = time.replace(reg, (big, $1, $2, $3) => {
console.log(big, $1, $2, $3);
});

在这里插入图片描述

  1. 在函数中我们返回的是啥,就把当前大正则匹配的内容替换成啥。
1
2
3
4
5
6
7
8
9
10
var time = "2020-5-1";
var reg = /(\d{4})-(\d{1,2})-(\d{1,2})/;
time = time.replace(reg, (...arg) => {
let [, $1, $2, $3] = arg;
$2.length < 2 ? $2 = "0" + $2 : null
$3.length < 2 ? $3 = "0" + $3 : null
return $1 + "年" + $2 + "月" + $3 + "日"

});
console.log(time);

案例:字符串首字母大写

函数被执行了六次,每一次都把正则匹配的信息传递给函数
每一次匹配:[“good”,”g”] [“good”,”g”] …

1
2
3
4
5
6
7
8
9
10
var str = "good good study, day day up";
var reg = /\b([a-zA-Z])[a-zA-Z]*\b/g;
str = str.replace(reg, (...arg) => {
var [content, $1] = arg;
$1 = $1.toUpperCase();
content = content.substring(1);
return $1 + content;

});
console.log(str);


愿你的坚持终有收获。