Я пишу рудиментарный лексер, используя регулярные выражения в JavaScript, и у меня есть два регулярных выражения (один для строк с одиночными кавычками и один для строк с двойными кавычками), которые я хочу объединить в один. Это мои два регулярных выражения (я добавил символы ^
и $
для целей тестирования):Как объединить эти два регулярных выражения в один?
var singleQuotedString = /^'(?:[^'\\]|\\'|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*'$/gi;
var doubleQuotedString = /^"(?:[^"\\]|\\"|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*"$/gi;
Теперь я попытался объединить их в одно регулярное выражение следующим образом:
var string = /^(["'])(?:[^\1\\]|\\\1|\\\\|\\\/|\\b|\\f|\\n|\\r|\\t|\\u[0-9A-F]{4})*\1$/gi;
Однако, когда я проверить ввод "Hello"World!"
он возвращает true
вместо false
:
alert(string.test('"Hello"World!"')); //should return false as a double quoted string must escape double quote characters
Я решил, что проблема в [^\1\\]
, которая должна соответствовать любому символу, кроме \1
(который является либо одиночной, либо двойной кавычкой - разделителем строки) и \\
(что является символом обратной косой черты).
Правильное выражение правильно отфильтровывает обратную косую черту и сопоставляет ограничители, но оно не отфильтровывает разделитель внутри строки. Любая помощь будет оценена. Обратите внимание, что я упомянул railroad diagrams Крокфорда, чтобы написать регулярные выражения.
Я никогда не знал, что вы можете сделать что-то вроде '(?! \ 1 | \\) .'. В [MDN] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp «RegExp - MDN») говорится, что '' x (?! Y) 'соответствует' x ', только если' x 'не следует' y''. –
@Aadit M Shah - Плохая аналогия. Вы всегда находитесь в позиции между символами в регулярных выражениях, как курсор. Утверждения сохраняются, и '(?!)' И '(? =)' Всегда ссылаются на то, что справа от текущей позиции. Его несущественное, что находится слева от него, кроме как если бы оно не соответствовало, вы не были бы на этом утверждении. – sln
Имеет смысл. Возможно, страница MDN должна быть обновлена. –