2011-05-28 104 views
8

我有一些随机字符串,例如:Hello, my name is john.。我想把这个字符串拆分成这样的数组:Hello, ,, , my, name, is, john, .,。我试过str.split(/[^\w\s]|_/g),但它似乎没有工作。有任何想法吗?如何用空格和标点符号分割JavaScript字符串?

+0

@davin:在正则表达式中捕获圆括号会将捕获的结果拼接到结果数组中,尽管它也包含空格。尽管如此,我无法用“分裂”和正则表达式得到完美匹配的结果。 – Reid 2011-05-28 15:45:27

回答

7

试试这个(我不知道这是否是你想要的):

str.replace(/[^\w\s]|_/g, function ($1) { return ' ' + $1 + ' ';}).replace(/[ ]+/g, ' ').split(' '); 

http://jsfiddle.net/zNHJW/3/

+1

这正是我想要的!谢谢 – chromedude 2011-05-28 16:04:54

+0

@chromedude最后一部分可以缩短为这种形式:'str.replace(/ [^ \ w \ s] | _/g,function($ 1){return''+ $ 1 +'';} ).split(/ [] +/g);'。我只是不习惯在正则表达式中使用split方法。 – pepkin88 2011-05-28 16:11:40

3

尝试:

str.split(/([_\W])/) 

这将通过任何非字母数字字符(\W)和任何下划线分裂。它使用捕获括号来包含在最终结果中拆分的项目。

+0

由于\ W表示任何不是A-Z,0-9或下划线的字符,您可以将/ [\ W \ s _] /简化为\ \ W /以获得相同的效果。要将不可接受字符的下划线添加到列表中,请将其添加到字符类的开头以提高效率。 – 2011-05-28 15:41:00

+0

@Rob:在'\ s'位击败你。尽管如此,我会先编辑它以使下划线成为下划线。谢谢。 – Reid 2011-05-28 15:43:55

+0

由于不需要捕获任何东西,因此它们是多余的,因为它们的添加会增加执行时间,所以应该将其删除。此外,字符类需要附加一个加号(以匹配一个或多个),除非您想要空的结果。因此,完整的表达式应该是“str.split(/ [\ _ \ W] + /)”(为了便于阅读,我将反斜杠转义添加到下划线,即使不需要)。 – 2011-05-28 17:12:41

15

要在非单词字符,即任何运行分割海峡不是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++&lt;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

+2

'split(/ \ W + /)'删除所有非英文字符。不要用它来分割名称。 – 2014-07-11 12:26:39

0

这个解决方案给我带来了空间挑战(仍然需要它们),然后我给了str.split(/\b/)一枪,一切都很好。数组中输出的空格不会被忽略,标点后留下的空格可以被删除。

相关问题