1

我正在使用regex从这样的字符串中捕获主题标签:

var words = "#hashed words and some #more #hashed words";
var tagslistarr = words.match(/#\S+/g); 

console.log(tagslistarr);

这将返回一个这样的数组;

["#hashed", "#more", "#hashed"]

问题:如何#从每个数组项中删除井号?这就是我最终想要的

["hashed", "more", "hashed"]
4

4 回答 4

5

尝试:

words.match( /#\S+/g ).map( function(x) { return x.replace(/^#/,''); } );

一个更好的方法是零宽度断言;不幸的是,JavaScript 不支持后视断言,只支持前瞻。(顺便说一句,这里有一篇关于在 JavaScript 中模仿后向断言的博客文章。我不能说因为我很关心任何解决方案,但它仍然是很好的阅读。我当然希望后向断言能够进入 ES6。)

正如 SimonR 在下面的评论中指出的那样,Array.prototype.map在 IE8 及以下版本中不可用。但是,polyfill 很容易:

if( !Array.prototype.map ) {
    Array.prototype.map = function(f) { 
        var r = []; 
        for( var i=0; i<this.length; i++ ) r[i] = f(this[i]); 
        return r; 
    }
}
于 2013-08-29T16:23:28.647 回答
4
var words = "#hashed words and some #more #hashed words";
var tagslistarr = words.match(/#\S+/g); 
tagslistarr = tagslistarr.map(function(x) { return x.substr(1); } );
console.log(tagslistarr)

印刷

["hashed", "more", "hashed"]
于 2013-08-29T16:24:55.287 回答
2

在您的正则表达式中使用捕获组:

words.replace(/#(\S+)/g, '$1');

编辑:

要将它们作为数组获取:

var tagslistarr = words.match(/#\S+/g);

for( var i = 0, l = tagslistarr.length; i < l; i++ ) {
  tagslistarr[ i ] = tagslistarr[ i ].substr( 1 );
}
于 2013-08-29T16:21:47.347 回答
1
var words = "#hashed words and some #more #hashed words";
var regexp = /#(\S+)/g; // Capture the part of the match you want
var results = [];
var match;
while((match = regexp.exec(words))) // Loop through all matches
  results.push(match[1]);           // Add them to results array

console.log(results);
于 2013-08-29T16:23:27.817 回答