Regex для извлечения всех пробелов, если они не заключены в скобки - PullRequest
0 голосов
/ 22 сентября 2019

Regex для извлечения всех пробелов, если они не заключены в фигурные скобки

Это для системы упоминаний javascript

ex: "Speak @ :: {Joseph Empyre} {b0268efc-0002-485b-b3b0-174fad6b87fc}, хорошо? "

Нужно получить:

[" Говори "," @ :: {Joseph Empyre} {b0268efc-0002-485b-b3b0-174fad6b87fc} ",", "," all "," верно? "]

[Редактировать]

Решено в: https://codesandbox.io/s/rough-http-8sgk2

Извините за мой плохой английский

1 Ответ

0 голосов
/ 22 сентября 2019

Я истолковал ваш вопрос, как вы сказали to fetch all spaces as long as they are not enclosed in braces, хотя ваш результат не соответствует ожиданиям.В вашем примере результата содержится пробел после выступления, а также отдельное совпадение для , после групп {}.Мой вывод ниже показывает, что я ожидаю от того, что, я думаю, вы просите, список строк, разбитых только на пробелы за скобками.

const str =
    "Speak @::{Joseph Empyre}{b0268efc-0002-485b-b3b0-174fad6b87fc}, all right?";

// This regex matches both pairs of {} with things inside and spaces
// It will not properly handle nested {{}}
// It does this such that instead of capturing the spaces inside the {},
// it instead captures the whole of the {} group, spaces and all,
// so we can discard those later
var re = /(?:\{[^}]*?\})|( )/g;
var match;
var matches = [];
while ((match = re.exec(str)) != null) {
  matches.push(match);
}

var cutString = str;
var splitPieces = [];
for (var len=matches.length, i=len - 1; i>=0; i--) {
  match = matches[i];
  // Since we have matched both groups of {} and spaces, ignore the {} matches
  // just look at the matches that are exactly a space
  if(match[0] == ' ') {
    // Note that if there is a trailing space at the end of the string,
    // we will still treat it as delimiter and give an empty string
    // after it as a split element
    // If this is undesirable, check if match.index + 1 >= cutString.length first
    splitPieces.unshift(cutString.slice(match.index + 1));
    cutString = cutString.slice(0, match.index);
  }
}
splitPieces.unshift(cutString);
console.log(splitPieces)

Консоль:

["Speak", "@::{Joseph Empyre}{b0268efc-0002-485b-b3b0-174fad6b87fc},", "all", "right?"]
...