I want modify my regular expression to also remove @ size but select only that word those are start with @ sign.
以下是我的代码,查看Live
JS
var a = "@abc @jat hi pat @jkl abc @cde vcd @cde ";
var s = a.match(/(?=(s{1}?@[^s]+)|(s?))(@[^s]+)(?=(s))/g);
console.log(s);
结果
["@abc", "@jat", "@jkl", "@cde", "@cde"]
预期结果
["abc", "jat", "jkl", "cde", "cde"]
由于JavaScript没有look-behind,我认为您不能在一个match
语句中完成它(无需后处理),因为您需要一个捕获组。
后处理对于ES5的Array#map
(可以填充)来说是微不足道的,当然:
var s = a.match(/(?=(s{1}?@[^s]+)|(s?))(@[^s]+)(?=(s))/g).map(function(entry) {
return entry.substring(1);
});
否则,您将需要使用一个捕获组和一个exec
循环。
顺便说一句,我认为正则表达式可以简单得多,如果你只想要s
分离:
var a = "@abc @jat hi pat @jkl abc @cde vcd @cde ";
var s = a.match(/@S+/g).map(function(entry) {
return entry.substring(1);
});
display(s.join(", "));
function display(msg) {
document.body.insertAdjacentHTML(
"beforeend",
"<p>" + msg + "</p>"
);
}
除非有什么令人信服的理由需要为此编写一个正则表达式,否则您最好只执行一些标准的拆分和筛选。
a.split(/s+/)
.filter(function(seg) { return seg[0]==='@'; })
.map (function(seg) { return seg.slice(1); })
如果你能使用箭头功能,它看起来不会那么糟糕:
a.split(/s+/)
.filter(seg => seg[0]==='@')
.map (seg => seg.slice(1))