JS正则表达式(6)=> 正则的练习题

正则的练习题

所有的单词大写
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
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值