Як розділити рядок на пробіли та ігноруючи пробіли, що ведуть і закінчують, на масив слів, використовуючи регулярний вираз?


77

Я зазвичай використовую такий код у JavaScript, щоб розділити рядок на пробіли.

"The quick brown fox jumps over the lazy dog.".split(/\s+/);
// ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

Звичайно, це працює навіть тоді, коли між словами є кілька пробілів.

"The  quick brown fox     jumps over the lazy   dog.".split(/\s+/);
// ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]

Проблема полягає в тому, що у мене є рядок, що містить пробіли, що ведуть або відстають, і в цьому випадку отриманий масив рядків буде містити порожній символ на початку та / або в кінці масиву.

"  The quick brown fox jumps over the lazy dog. ".split(/\s+/);
// ["", "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog.", ""]

Усунути такі порожні символи - тривіальне завдання, але я б скоріше подбав про це в рамках регулярного виразу, якщо це взагалі можливо. Хтось знає, якими регулярними виразами я міг би досягти цієї мети?


Коні на курси. splitвикористовується для розділення рядка, а не для його мутації . Подивіться, як обрізати рядок у JavaScript? .
DCoder

на жаль, javascript не підтримує lookbehind, і навіть якби ви використовували lookbehind , у першому розколі
міститься місце

Я ніколи не думав про це з такої точки зору. Дякуємо, що вказали на це!
natlee75

ви не можете виконати обрізку () до розколу?
Jacques Koorts

Відповіді:


120

Якщо вас більше цікавлять біти, які не є пробілами, ви можете порівняти непробіли, замість того, щоб розділяти пробіли.

"  The quick brown fox jumps over the lazy dog. ".match(/\S+/g);

Зверніть увагу, що повертається наступне null:

"   ".match(/\S+/g)

Тож найкращий шаблон для вивчення:

str.match(/\S+/g) || []

10
Обережно, замість ' '.match(/\S+/g)повертається ! null[]
Енді,

Цікаво, чиє рішення швидше ваше або @Josh (якщо ми розглянемо справу [""]).
ibodi

49

" The quick brown fox jumps over the lazy dog. ".trim().split(/\s+/);


3
Дякую за пропозицію. Я насправді збирався йти цим шляхом, поки не згадав, що для цього потрібен браузер, що підтримує JavaScript 1.8. Це добре для більшості наших користувачів, але ми все ще підтримуємо старі браузери, такі як Internet Explorer 7 та 8, чиї механізми JavaScript не включають цю функцію.
natlee75

9
Стережись, ' '.trim().split(/\s+/)повертаєшся [""]!
Енді,

Цікаво, чиє рішення швидше ваше (якщо ми розглянемо справу [""]) або @kennebec
ibodi

16

Замість розбиття на пробіли послідовностей, ви можете зіставити будь-які не пробіли послідовності:

"  The quick brown fox jumps over the lazy dog. ".match(/\S+/g)

0

Не елегантно, як коди інших, але дуже легко зрозуміти:

    countWords(valOf)
    {
        newArr[];
        let str = valOf;
        let arr = str.split(" ");

        for (let index = 0; index < arr.length; index++) 
       {
           const element = arr[index];
           if(element)
           {
              newArr.push(element);
           }
       }
       const NumberOfWords = newArr.length;

       return NumberOfWords;
   }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.