正则的练习题
所有的单词大写
let str = "HELLO, lyw, Although you leave me, but I will have been waiting for you that you come back to me"
let reg = /\b([a-zA-Z]+)\b/g; // \b是匹配单词的边界
str = str.replace(reg, (...args) => {
let [, word] = args;
word = word[0].toUpperCase() + word.substring(1).toLowerCase();
return word
})
console.log(str);
次数最多的单词
let str = "HELLO, lyw, Although you leave me, but I will have been waiting for you that you come back to me"
// 匹配出现次数最多的单词, 并且打印出他的次数
-
方法一
/** * 方法一: * 1. 用match把所有单词匹配出来, 结果为一个数组 * 2. 遍历数组, 把其存到一个对象里, 并映射其出现的值 */ let reg = /\b[a-zA-Z]+\b/g; let words = str.match(reg); let obj = {}; words.forEach((item, index) => { typeof obj[item] === 'number' ? obj[item]++ : obj[item] = 1 }) function maxCounter(obj) { let word = null; let counter = null; let start = 0; for (let i in obj) { if (start == 0) { start++ word = i; counter = obj[i] } else { if (obj[i] > counter) { word = i counter = obj[i] } } } return `出现次数最多的单词:${word}, 出现次数:${counter}` } console.log(maxCounter(obj)) // => 出现次数最多的单词:you, 出现次数:3
-
方法二
/** * 方法二: * 1. 先把字符串拆分成列表, 进行字母的排序 * 2. 把字母的重新组合, 用正则进行相同字母的匹配 * 3. 从正则匹配出的列表里面取出前面最常出现的项 */ let str = 'feglkdroijhoijslkjhlkdskfhivsasafafaewiofigijlkfb'; let arry = str.split('').sort((a, b) => a.localeCompare(b)).join(''); arry = arry.match(/([a-z])\1+/g).sort((a, b) => b.length - a.length); let max = arry[0].length, res = []; for (let i in arry) { if (arry[i].length === max) { res.push(arry[i]) } } if (res.length > 1) { let str = ''; for (let s of res) { str = `${str}${s[0]} ` } console.log(`出现次数最多的字母次数为 ${max} 次, 他们是 ${str}`) } else { console.log(`出现次数最多的字母次数为 ${max} 次, 其为 ${res[0]}`) }
-
方法三
/** * 方法二: * 1. 先把字符串拆分成列表, 进行字母的排序后重新合并字符串 * 2. 对字符串进行 */ let str = 'feglkdroijhoijslkjhlkdskfhivsasafafaewiofigijlkfb'; let arry = str.split('').sort((a, b) => a.localeCompare(b)).join(''); let flag = false for (let i = str.length; i > 0; i--) { let reg = new RegExp(`([a-z])\\1{${i-1}}`, 'g'); arry.replace(reg, (...args) => { console.log(`出现次数最多的字母是: ${args[0][0]}, 共出现: ${args[0].length} 次`); flag = true; }) if (flag) { break } } // 出现次数最多的字母是: f, 共出现: 6 次 // 出现次数最多的字母是: i, 共出现: 6 次
时间字符串格式化
/**
* 把服务器获取的时间转换成我们需要的格式
* 服务器获取:
* - "2020-1-21 14:47:2"
* - "2020/1/21 14:47:2"
* - "2020-1-21"
* 转换成:
* - "01月21日 14时47分"
* - "2020年1月21日"
* 调用:time.formatTime()
*/
// 闭包, 把方法扩展到String的原型上
~ function () {
/**
* formatTime:时间字符串的格式化处理
* @params
* template: [string] 我们期望的日期格式
* 模板格式: {0}为年 {1~5}为月~秒, 模板可以根据字符串自己写
* @return
* 一个格式化后的时间字符串
*/
function formatTime(template = "{0}年{1}月{2}日 {3}时{4}分{5}秒") {
// 1. 首先获取字符串的中的年月日信息
let timeArry = this.match(/\d+/g);
console.log(timeArry);
return template.replace(/\{(\d)\}/g, (...[, $1]) => {
let res = timeArry[$1] || '00';
return res.length < 2 ? '0' + res : res;
})
}
// Date.prototype.formatTime = formatTime
['formatTime'].forEach(item => {
String.prototype[item] = eval(item);
})
}()
let time1 = '2019/1/21 15:41'
console.log(time1.formatTime())
// => 2019年01月21日 15时41分00秒
let time2 = '1/21 15:41'
console.log(time2.formatTime('{1}日{0}月 {3}分{2}时'))
// => 21日01月 41分15时
获取url参数信息
// 方法一: 用spilt对正则匹配下来的字符串进行分割
/**
* queryURLParams: 获取URL地址?后面的字符串参数信息
* @params
* @return
* [object]: 把所有的参数以键值对的方式储存起来
* by xyb on 2020/1/21
*/
~ function () {
function queryURLParams() {
let reg = /(?:https|http):\/\/.*?\/s\?([^\u2002]+)/,
hash = reg.exec(this)[1].split('#')[1], // 解析hash值 #后面的
params = reg.exec(this)[1].split('#')[0].split('&'), // 解析参数
obj = {}
params.forEach((item) => {
let res = item.split('=');
obj[res[0]] = res[1]
})
obj['hash'] = hash;
return obj
}
['queryURLParams'].forEach(item => {
String.prototype[item] = eval(item)
})
}()
let str =
"https://www.baidu.com/s?wd=%E5%A4%A7%E4%BA%8C%E8%BF%98%E8%83%BD%E5%85%A5%E5%85%9A%E5%90%97&rsv_spt=1&rsv_iqid=0xe198dd5c0001554c&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100&rsv_sug2=0&inputT=3709&rsv_sug4=4219#6266dwa"
console.log(str.queryURLParams())
// 方法二: 好方法, 先用字符串的 replace + 正则的分组匹配, 把数据匹配出来, 再在函数中对其进行处理并映射到对象中
~ function () {
function queryURLParams() {
let obj = {};
this.replace(/([^=#&?]+)=([^=?#&]+)/g, (...[, $1, $2]) => {obj[$1] = $2;})
this.replace(/#([^=#&?]+)/, (...[, $1]) => {obj['HASH'] = $1;})
return obj
}
['queryURLParams'].forEach(item => {String.prototype[item] = eval(item)})
}()
let str =
"https://www.baidu.com/s?wd=%E5%A4%A7%E4%BA%8C%E8%BF%98%E8%83%BD%E5%85%A5%E5%85%9A%E5%90%97&rsv_spt=1&rsv_iqid=0xe198dd5c0001554c&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_dl=tb&rsv_enter=1&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100&rsv_sug2=0&inputT=3709&rsv_sug4=4219#6266dwa"
console.log(str.queryURLParams())
千分符的格式化
-
一行代码解决
/** * millimeter: 返回一个被处理过的数据财务数据 */ ~ function () { function millimeter() { return this.replace(/\d{1,3}(?=(\d{3})+$)/g, content => content + ',') // 1. (?=) 是正向预查的意思, 也是只匹配不捕获 // 2. \d{1,3}表示被捕获的数字可以是1~3位 // 3. (?=(\d{3})+$表示最后面的数字必须以3个一组成对出现 } ['millimeter'].forEach(item => { String.prototype[item] = eval(item); }) }() console.log('1300000000'.millimeter()); // 1,300,000,000 console.log('121565656'.millimeter()); // 121,565,656 console.log('3133258833'.millimeter()); // 3,133,258,833