正则题--JS

正则表达式的语法纯纯的记的话,我有点记不住,那就通过题来记正则吧~~@_@~~

这是一道面试题,达到如下效果:

// destructuringArray( [1,[2,4],3], "[a,[b],c]" ); 
// result // { a:1, b:2, c:3 }
//正则表达式
const result3 = "[a,[b],c]".replace(/([a-z])/g, '"$1"')
//给第一个()内匹配到的字母添加“”双引号
//打印结果:["a",["b"],"c"]
/**正则表达式
 * $1代表第一个小括号中的内容
 * $2代表第二个小括号中的内容
 * ()为了提取匹配的字符串
 * []字符集合
 * 1.匹配一类集合
 *    [abc] 表示匹配a或b或c
 * 2.匹配很多字符,可以使用-表示一个范围内的字符
 *    [0123456789][0-9]的作用一样
 * 	  [abcdefghijklmnopqrstuvwxyz][a-z]的作用是一样的
 * {}一般用来表示匹配的长度
 */
/**json格式的字符串
 * 1.字符串内写的是对象:'{"name":"Jack","age":18}'
 * 2.字符串内写的是数组: '["a",["b"],"c"]'
 *
 * JSON.parse 把json类型转换为js格式的数据(对象/字符串)
 */
function demo3(strArray, arr, obj) {
  for (let i = 0; i < strArray.length; i++) {
    if (strArray[i] instanceof Array) {
      demo3(strArray[i], arr[i], obj);
    } else {
      obj[strArray[i]] = arr[i]
    }
  }
}

const destructuringArray3 = (arr, str) => {
  const string = str.replace(/([a-z])/g, '"$1"')
  const strArray = JSON.parse(string);
  const obj = {};
  demo3(strArray, arr, obj)
  console.log(obj)
  return obj;
}

destructuringArray3([1, [2, 4], 3], "[a,[b],c]");
destructuringArray3([1, [2, [4]], 3], "[a,[b,[d,e]],c]")

打印结果:
{ a: 1, b: 2, c: 3 }
{ a: 1, b: 2, d: 4, e: undefined, c: 3 }

格式化金钱

const ThousandNum = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
const money = ThousandNum(20190214);// money => "20,190,214"
const money2 = ThousandNum(12345.67);// 12,345.67
/**
 * \是转义字符
 * \\匹配\本身
 * [] 字符集合;例如[abc] 匹配a或b或c
 * {}一般用来匹配长度
 * d 表示数字0-9
 * \d 表示 匹配0-9的数字
 * g 遇到第一个匹配符就会结束
 * {3} 表示需要3个
 * d{3} 表示3个数字
 * ^ 匹配开头
 * ^ 在[]外表示匹配开头的意思 例如:^[abc] 能够匹配以abc开头的任意字符
 * ^ 在[]里面表示反选的意思 例如:[^abc] 能够匹配abc之外的任意字符
 * ^(\d)$ 表示 匹配开头是0-9的任意一个数字
 * \d+ 表示一到多个数字
 * ?表示前面这部分是可选的,这部分匹配一个可选的小数部分
 * -? 表示前面可以有一个可选的减号
 * (\.\d+)?表示一个小数点跟多个数字
 * (\d{3})+ 表示3的倍数个数字 例如:3个字数 6个字数
 * (?=表达式) 先行断言 先浏览字符串是否满足表达式的要求;
 *    例如: x(?=y) 如果x后面跟的是y,则匹配。
 *          如字符串xyz 中的x会被匹配,而后面的y是不会被匹配的
 *    例如:“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,
 *          但不能匹配“Windows3.1”中的“Windows”。
 *    例如:(?=1)2 可以匹配12,不能匹配22
 * (?!表达式) 后行断言 先检查字符串是否不满足表达式要求
 *    例如:(?!1)2  可以匹配22, 不能匹配12
 *    例如:“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,
 *          但不能匹配“3.1Windows”中的“Windows”。
 *
 * 由此可知,我们需要找的是一个位置,这个位置后面跟的东西需要满足一定的条件
 *           需要满足什么条件呢?
 *           对于我们熟知的千分位来说,当前是从右到左每三位数字添加一个逗号
 * /b 匹配单词边界
 *    怎样算是字符边界?
 *    1.字符串的第一个字符的前面。如果这个字符是单词字符(word character)的话
 *    2.字符串的最后一个字符的后面。如果这个字符是单词字符(word character)的话
 *    3.字符串中两个字符之间,如果其中一个字符是单词字符(word character)而另外一个不是
 *  例如:\bword\b 可以实现“单词”的整个匹配,并不会匹配到wword1这种字符串
 *        因为wword1不是单词
 * \B匹配非单词边界。
 * /\B(?=)/ 表示 除了\B以外的部分都不属于匹配结果
 *          也就是说,整个表达式里,真正参与 最后的匹配到替换成,的是前面的这个\B
 *
 * 找寻后面跟了3的倍数个位数字的位置,
 * /\B(?=(\d{3})+)/
 * (\d{3})+  这里的+号匹配1个或1个以上括号里的内容
 *           也就是3个数字构成一个字符串
 * 先行断言保证了每个位置后面有跟了3的倍数个数字,
 * 但是没有保证它后面有只跟了3的倍数个数字
 *
 * (?!\d)表示后面不能再跟数字了
 *
 * (?=(\d{3})+(?!\d))代表的是:后面需要跟3的倍数个数字,
 * 且在这(3的倍数个数字)之后不能再有数字了。他可以是小数点.或字符串尾
 * "20,190,214"  214 是第一个3的倍数  214,190  是第二个3的倍数
 *  第三个数字后面添加,第6个数字后面添加,
 *  如果3倍数后面遇可以跟小数点,但不能跟数字了(也就是说保证了只能是3个数字)
 *
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值