Как вы разделяете строку JavaScript по пробелам и пунктуации? - PullRequest
10 голосов
/ 28 мая 2011

У меня есть какая-то случайная строка, например: Hello, my name is john..Я хочу, чтобы эта строка была разбита на массив, как это: Hello, ,, , my, name, is, john, .,.Я пытался str.split(/[^\w\s]|_/g), но, похоже, не работает.Есть идеи?

Ответы [ 4 ]

19 голосов
/ 28 мая 2011

Чтобы разделить строку на любой набор несловарных символов, т. Е. Не AZ, 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

9 голосов
/ 28 мая 2011

Попробуйте это (я не уверен, что это то, что вы хотели):

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

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

4 голосов
/ 28 мая 2011

Попробуйте:

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

Это будет разделено на любой не буквенно-цифровой символ (\W) и любое подчеркивание.Он использует захват скобок, чтобы включить элемент, который был разделен на конечный результат.

0 голосов
/ 08 января 2018

Это решение вызвало для меня проблему с пробелами (они все еще были нужны), затем я сделал str.split(/\b/) попытку, и все хорошо.В массив выводятся пробелы, которые не составит труда игнорировать, а оставшиеся после пунктуации можно обрезать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...