正则表达式的语法纯纯的记的话,我有点记不住,那就通过题来记正则吧~~@_@~~
这是一道面试题,达到如下效果:
// 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个数字)
*
*/