某一个字符串为'a_b_2_d_1'
我想匹配到_
后面的字母与数字,但是不匹配_
,
于是我写了:
let str = "a_b_2_d_1"
let result = str.match(/(?:_)[a-z0-9]+/gi);
console.log(result); //["_b", "_2", "_d", "_1"]
结果将_
也匹配了进去,match是与(?:)
不生效呢,还是为什么。
如果不用这种方式还能怎么写呢?
某一个字符串为'a_b_2_d_1'
我想匹配到_
后面的字母与数字,但是不匹配_
,
于是我写了:
let str = "a_b_2_d_1"
let result = str.match(/(?:_)[a-z0-9]+/gi);
console.log(result); //["_b", "_2", "_d", "_1"]
结果将_
也匹配了进去,match是与(?:)
不生效呢,还是为什么。
如果不用这种方式还能怎么写呢?
如果你是说不抓取第一个字母可以用
let str = "a_b_2_d_1"
let result = str.match(/\B[a-z0-9]+/gi);
如果是不抓取a
let str = "a_b_2_d_1"
let result = str.match(/[b-z0-9]+/gi);
我觉得你是想用零宽断方。JS 的正则表达式支持正向零宽断言,不支持负向零宽断言(正向是向右),而你的需求是负向断言 _
号,所以用零宽断言实现不了你的需求。
.split()
是一种比较取巧的解决办法,如果需求不扩展的话,够用了
如果实在需要通过正则表达式来取 _
后的字母/数字,可以用 /_[a-z0-9]+?/g
,得到 match 数组之后,再把前面的 _
号去掉
s.match(/_[a-z0-9]+?/g).map(s => s.substr(1))
// ["b", "2", "d", "1"]
突然觉得我理解错了,你应该不是想用零宽断言,而是搞错了 (?:)
的意思。
在正则表达式不带 g
参数的时候,括号内的匹配内容会保存下来,比如
m = s.match(/(_)[a-z0-9]+?/)
// ["_b", "_"]
数组第一个元素是正则表达式匹配到的整个字符串,第二个元素是括号中的匹配到的内容。如果有多个括号,会依次保存在结果数组中
但是如果在括号里面前缀 ?:
,表示不保存匹配内容
m = s.match(/(?:_)[a-z0-9]+?/)
// ["_b"]
结果只有整个
// 不一定需要用(?:)不捕获。
let str = "a_b_2_d_1";
str.split('_'); // ["a", "b", "2", "d", "1"]。不取a即可
推荐两个网址:
可以用 在线正则图形化验证你写的正则%5Ba-z0-9%5D%2B),这样看的更明白些
在线正则验证
// 如果要匹配`_`后面的字母或数字。
let str = "a_b_2_d_1-&90989";
let resultArr = str.match(/_([0-9a-z]+)/g); // ["_b", "_2", "_d", "_1"]。再对结果做map操作
let result = resultArr.map(el => {
return el.slice(1);
});
console.log(result); // ["b", "2", "d", "1"]
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
你可以去查下
match
的用法,match
根据正则表达式里面有没有全局匹配g
,会返回不同的结果,如果不是全局匹配,那么返回的结果是数组,第一个元素是匹配的完整字符串,从第二个元素开始是捕获型括号的内容;如果是全局匹配,返回的结果是一个数组,数组的每个元素都是匹配的完整字符串
,没有捕获型括号的内容。使用
exec
,代码如下: