JavaScript RegExp从起始位置删除@sign



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))

最新更新