Javascript — выражение регулярного выражения для разделения строк на точки с запятой, за исключением случаев, когда оно используется внутри одинарных или двойных кавычек

#javascript #regex

#javascript #регулярное выражение

Вопрос:

В настоящее время я использую следующее регулярное выражение, но оно терпит неудачу, когда у меня незакрытые кавычки.

 const expression = /([^;"'] (("((\")|[^"])*")|('((\')|[^'])*')|[^;'"]*)*);?/gm;
const matchedArray = str.match(expression);
  

Так что это работает нормально: str;that;works;

И это также: str;that'works;';fine"always";

Но это не удается: str'doesn't work'; потому что это удаляет последнюю одинарную кавычку

Это также не удается: str'doesn''t work'; потому что оно удаляет последнюю одинарную кавычку

Итак, мне нужно регулярное выражение, которое поддерживает мои существующие строки, а также те, которые прерываются. Спасибо!

Комментарии:

1. Напишите синтаксический анализатор.

Ответ №1:

Идея состоит в том, чтобы скрыть строки в кавычках перед разделением и восстановить их впоследствии. Экранирующая кавычка не является кавычкой; ни экранированная точка с запятой, точка с запятой. Незакрытая кавычка длится до конца строки.

 let hidden = [];
   
const split = str => str
    .replace (/(?<!\)'([^']|\')*((?<!\)'|$)|(?<!\)"([^"]|\")*((?<!\)"|$)/g, s => 'x01'   hidden.push (s)   'x02')
    .split (/(?<!\);/)
    .map (s => {
      for (let i = 0; i < hidden.length; i  ) {
        s = s.replace ('x01'   (i   1)   'x02', hidden [i]);
      }
      return s;
    });
    
const tests = [
  `str;that'works;';fine"always";`,
  `str'doesn't work';`,
  `str'doesn't work';`,
  `str'doesn\'t work';`,  
  `str'doesn''t work';or does it?`,
  `str'doesn\''t work';or does it?`  
];

for (let test of tests) {
  console.log (test   ' => '   split (test));
}  

Комментарии:

1. Это отлично работает в Chrome. Но он выходит из строя в firefox и Safari. Ошибка синтаксиса: недопустимая группа регулярных выражений

2. @augustinilea, странно: я запустил его в Firefox.

3. кажется, что внешний вид поддерживается с firefox v78, но в safari по-прежнему нет поддержки. caniuse.com/js-regexp-lookbehind