优美编程正则表达式=>js

有趣的正则题0

2018-08-05  本文已影响8人  小遁哥

解析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);

相关连接
https://coolshell.cn/articles/2704.html

上一篇下一篇

猜你喜欢

热点阅读