2011-05-28 150 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/)一槍,一切都很好。數組中輸出的空格不會被忽略,標點後留下的空格可以被刪除。

相關問題