#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