Я пытаюсь разбить текст следующим образом на пробелы:

var line = "Text (what is)|what's a story|fable called|named|about {Search}|{Title}"

Но я хочу игнорировать пробелы в скобках. Это должно создать массив с:

var words = ["Text", "(what is)|what's", "a", "story|fable" "called|named|about", "{Search}|{Title}"];

Я знаю, что это должно включать какое-то регулярное выражение с line.match (). Бонусные баллы, если регулярное выражение удаляет скобки. Я знаю, что word.replace () избавится от них на следующем шаге.

2
Optimus 10 Дек 2016 в 15:34

3 ответа

Лучший ответ

Используйте следующий подход с конкретным шаблоном регулярных выражений (на основе отрицательного прогнозного утверждения ):

var line = "Text (what is)|what's a story|fable called|named|about {Search}|{Title}",
    words = line.split(/(?!\(.*)\s(?![^(]*?\))/g);
  
console.log(words);
  • (?!\(.*) гарантирует, что разделителю \s не предшествует фигурная скобка ( (включая сопровождающие символы)
  • (?![^(]*?\)) гарантирует, что за разделителем \s не следует фигурная скобка ) (включая сопровождающие символы)
6
RomanPerekhrest 10 Дек 2016 в 12:52

Один из подходов, который полезен в некоторых случаях, состоит в том, чтобы заменить пробелы в скобках с помощью заполнителя, затем разделить, а затем заменить.

var line = "Text (what is)|what's a story|fable called|named|about {Search}|{Title}";

var result = line.replace(/\((.*?)\)/g, m => m.replace(' ', 'SPACE'))
  .split(' ')
  .map(x => x.replace(/SPACE/g, ' '));
  
console.log(result);
                 
0
user663031user663031 10 Дек 2016 в 13:19

Ни одного регулярного выражения, но делает свою работу. Удаляет скобки и разделяет текст по пробелам.

var words = line.replace(/[\(\)]/g,'').split(" ");
0
David Katona 10 Дек 2016 в 12:57