解析URL中的参数
var str = "?name=小遁&age=23";
var pattern = /\?([^=&]+)=([^=&]+)/;
console.log(str.match(pattern))
输出为
["?name=小遁", "name", "小遁", index: 0, input: "?name=小遁&age=23", groups: undefined]
下面的写法能匹配age=23吗?
var str = "?name=小遁&age=23";
var pattern = /\?(([^=&]+)=([^=&]+)&?)*/;
console.log(str.match(pattern))
输出为
["?name=小遁&age=23", "age=23", "age", "23", index: 0, input: "?name=小遁&age=23", groups: undefined]
因为分组的个数在书写正则的时候就确定了,name=小遁也匹配了,但是被age=23给覆盖了。
正解为
var str = "?name=小遁&age=23";
var pattern = /([^=?&]+)=([^=&]+)/g;
var obj = {};
str.replace(pattern,(all,key,value)=>obj[key]=value);
Tips
调用match方法时,传入的正则表达式带有g,将不会理会分组。
实现数字的千分位分割
var str = "12345678";
var pattern = /\B(?=((\d{3})+(?!\d)))/g;
var result = str.replace(pattern,(...args)=>{
console.table(args);
return ",";
});
console.log(result)
为了便于理解我多加了分组
image.png因为分组覆盖的原因,第二个分组的值总是678 这让人很迷惑
?= ?! 所在的括号不算做一个分组,这是语法。
\B 匹配非单词边界
"78" 7前面和8后面是单词边界 7与8中间不是单词边界
"78 12" 78后面与12前面是单词边界
这是上述正则能在数字与数字之间插入符号的原因
匹配一个非单词边界,他的后面有一个或多个(3个数字),且三个数字后面没有数字
相当于从左往右加,号,如果按照正向思维从右往左加,号,则很麻烦
上述正则可改为/\B(?=(\d{3})+$)/g;
识别一个数不是质数
已数字12为例,其实12是一个抽象的表示,正则是用来匹配字符串具有某种规律的。
这就需要在正则与字符串之间做一个转换。
再深一步,我们如何判断一个数是否为质数呢,就是看这个数能否被2整除,能否被3整除...
进而一堆物品能否被分为2份,分为3分..。
我们把12转换成12个1,12个2 这样的字符串,因为他们任意位置2个、3个..组合都可以被视为相同的一组,能够满足算法的需求。
var number = 12;
var str = Array(number + 1).join(1);
var pattern = /^1$|^(11+)\1$/;
var result = pattern.test(str);
网友评论
var str ="1234567";
var result = str.replace(/\B/g,",");
console.log(result);