我有一些随机字符串,例如:Hello, my name is john.
。我希望将这个字符串分割成一个数组,就像这样:Hello, ,, , my, name, is, john, .,
。我尝试使用str.split(/[^\w\s]|_/g)
,但它似乎无效。有什么想法吗?
我有一些随机字符串,例如:Hello, my name is john.
。我希望将这个字符串分割成一个数组,就像这样:Hello, ,, , my, name, is, john, .,
。我尝试使用str.split(/[^\w\s]|_/g)
,但它似乎无效。有什么想法吗?
将字符串按任何非单词字符的连续出现进行拆分。即不是 A-Z、0-9 和下划线。
var words=str.split(/\W+/); // assumes str does not begin nor end with whitespace
假设你的目标语言是英语,你可以使用以下方法从字符串中提取所有语义上有用的值(即将字符串“标记化”):
var str='Here\'s a (good, bad, indifferent, ...) '+
'example sentence to be used in this test '+
'of English language "token-extraction".',
punct='\\['+ '\\!'+ '\\"'+ '\\#'+ '\\$'+ // since javascript does not
'\\%'+ '\\&'+ '\\\''+ '\\('+ '\\)'+ // support POSIX character
'\\*'+ '\\+'+ '\\,'+ '\\\\'+ '\\-'+ // classes, we'll need our
'\\.'+ '\\/'+ '\\:'+ '\\;'+ '\\<'+ // own version of [:punct:]
'\\='+ '\\>'+ '\\?'+ '\\@'+ '\\['+
'\\]'+ '\\^'+ '\\_'+ '\\`'+ '\\{'+
'\\|'+ '\\}'+ '\\~'+ '\\]',
re=new RegExp( // tokenizer
'\\s*'+ // discard possible leading whitespace
'('+ // start capture group
'\\.{3}'+ // ellipsis (must appear before punct)
'|'+ // alternator
'\\w+\\-\\w+'+ // hyphenated words (must appear before punct)
'|'+ // alternator
'\\w+\'(?:\\w+)?'+ // compound words (must appear before punct)
'|'+ // alternator
'\\w+'+ // other words
'|'+ // alternator
'['+punct+']'+ // punct
')' // end capture group
);
// grep(ary[,filt]) - filters an array
// note: could use jQuery.grep() instead
// @param {Array} ary array of members to filter
// @param {Function} filt function to test truthiness of member,
// if omitted, "function(member){ if(member) return member; }" is assumed
// @returns {Array} all members of ary where result of filter is truthy
function grep(ary,filt) {
var result=[];
for(var i=0,len=ary.length;i++<len;) {
var member=ary[i]||'';
if(filt && (typeof filt === 'Function') ? filt(member) : member) {
result.push(member);
}
}
return result;
}
var tokens=grep( str.split(re) ); // note: filter function omitted
// since all we need to test
// for is truthiness
这将产生:
tokens=[
'Here\'s',
'a',
'(',
'good',
',',
'bad',
',',
'indifferent',
',',
'...',
')',
'example',
'sentence',
'to',
'be',
'used',
'in',
'this',
'test',
'of',
'English',
'language',
'"',
'token-extraction',
'"',
'.'
]
编辑
还可以作为Github Gist获取。
split(/\W+/)
可以去除所有非英文字符。但切勿用于姓名的分割。 - Dan Abramov试试这个(我不确定这是否是你想要的):
str.replace(/[^\w\s]|_/g, function ($1) { return ' ' + $1 + ' ';}).replace(/[ ]+/g, ' ').split(' ');
str.replace(/[^\w\s]|_/g, function ($1) { return ' ' + $1 + ' ';}).split(/[ ]+/g);
。我只是不习惯使用正则表达式的split方法。 - pepkin88尝试:
str.split(/([_\W])/)
这将按照任何非字母数字字符(\W
)和任何下划线进行拆分。它使用捕获括号来在最终结果中包含被拆分的项。
\s
方面我比你快。不过我会把下划线放在前面,谢谢。 - Reidstr.split(/\b/)
,一切都很好。空格会在数组中输出,不难忽略,在标点符号后剩下的可以被修剪掉。