持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
m多行匹配修正符
下面的字符串,想匹配所有商品的数据,写了如下正则表达式,多个或没空格➕井号+数字+一个或多个空格+任意字符一个或者多个➕一个或多个空格➕井号+一个或多个空格,匹配结果并不如意,匹配了4条符合条件的,但是肉眼可以看到,第三个不符合条件,简单的区别是每一行都是以井号结束,第三行不是,那么问题来了,是不是可以按照每行来匹配字符串呢?
var shi = `
#1 js,200元 #
#2 php,20000元 #
#8 baidu.com # 骚帮
#3 node.js,10元 #
`
var reg = /\s*#\d\s+.+\s+#\s+/g
console.log(shi.match(reg))
// ['\n #1 js,200元 #\n ', '#2 php,20000元 #\n ', '#3 baidu.com # ', '\n #4 node.js,10元 #\n ']
答案是ok的,把每一行当成一个主体,问题就非常好处理了,直接判断是不是以井号结束就ok了
var shi = `
#1 js,200元 #
#2 php,20000元 #
#3 baidu.com # 骚帮
#4 node.js,10元 #
`
var reg = /.*#$/gm
console.log(shi.match(reg))
精彩实例,将上面字符串的商品,提取出商品的名称和价格。用上面的方法匹配到字符串,然后掐头去尾,只留中间部分,然后split一分为2,然后解构就可以获取到第一个是商品名称,第二个是商品价格
var shi = `
#1 js,200元 #
#2 php,20000元 #
#3 baidu.com # 骚帮
#4 node.js,10元 #
`
var reg = /.*#$/gm
console.log(shi.match(reg).map(v => {
v = v.replace(/\s*#\d+\s/, "").replace(/\s+#/, '');
const [
name,
price
] = v.split(',')
return {
name,
price
}
}))
exce
exce方法,返回匹配的字符,并且记录当前匹配的位置,下一次匹配会在这个位置开始查找下一个匹配,必须是在g模式下才遵守这个规则,否则每次只匹配第一个匹配,有点类似generator函数,可以利用while循环遍历
var shi = "shi";
var reg = /\w/g
console.log(reg.exec(shi))
console.log(reg.exec(shi))
console.log(reg.exec(shi))
console.log(reg.exec(shi))
遍历代码如下
var shi = "shi";
var reg = /\w/g;
var a = null;
while (a = reg.exec(shi)) {
console.log(a)
}