如何用空格和标点符号分割JavaScript字符串?
我有一些随机字符串,例如:Hello, my name is john.
。我想把这个字符串拆分成这样的数组:Hello, ,, , my, name, is, john, .,
。我试过str.split(/[^\w\s]|_/g)
,但它似乎没有工作。有任何想法吗?如何用空格和标点符号分割JavaScript字符串?
试试这个(我不知道这是否是你想要的):
str.replace(/[^\w\s]|_/g, function ($1) { return ' ' + $1 + ' ';}).replace(/[ ]+/g, ' ').split(' ');
这正是我想要的!谢谢 – chromedude 2011-05-28 16:04:54
@chromedude最后一部分可以缩短为这种形式:'str.replace(/ [^ \ w \ s] | _/g,function($ 1){return''+ $ 1 +'';} ).split(/ [] +/g);'。我只是不习惯在正则表达式中使用split方法。 – pepkin88 2011-05-28 16:11:40
尝试:
str.split(/([_\W])/)
这将通过任何非字母数字字符(\W
)和任何下划线分裂。它使用捕获括号来包含在最终结果中拆分的项目。
由于\ W表示任何不是A-Z,0-9或下划线的字符,您可以将/ [\ W \ s _] /简化为\ \ W /以获得相同的效果。要将不可接受字符的下划线添加到列表中,请将其添加到字符类的开头以提高效率。 – 2011-05-28 15:41:00
@Rob:在'\ s'位击败你。尽管如此,我会先编辑它以使下划线成为下划线。谢谢。 – Reid 2011-05-28 15:43:55
由于不需要捕获任何东西,因此它们是多余的,因为它们的添加会增加执行时间,所以应该将其删除。此外,字符类需要附加一个加号(以匹配一个或多个),除非您想要空的结果。因此,完整的表达式应该是“str.split(/ [\ _ \ W] + /)”(为了便于阅读,我将反斜杠转义添加到下划线,即使不需要)。 – 2011-05-28 17:12:41
要在非单词字符,即任何运行分割海峡不是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 + /)'删除所有非英文字符。不要用它来分割名称。 – 2014-07-11 12:26:39
这个解决方案给我带来了空间挑战(仍然需要它们),然后我给了str.split(/\b/)
一枪,一切都很好。数组中输出的空格不会被忽略,标点后留下的空格可以被删除。
@davin:在正则表达式中捕获圆括号会将捕获的结果拼接到结果数组中,尽管它也包含空格。尽管如此,我无法用“分裂”和正则表达式得到完美匹配的结果。 – Reid 2011-05-28 15:45:27