Азмисов, воскрешает этот вопрос, потому что вы сказали, что искали any efficient alternative that could be used in JavaScript
и any elegant solutions that would work in most, if not all, cases
.
Это простое общее решение, которое не было упомянуто.
По сравнению с альтернативами регулярное выражение для этого решения удивительно просто:
"[^"]+"|(\+)
Идея состоит в том, что мы сопоставляем, но игнорируем что-либо в кавычках, чтобы нейтрализовать это содержимое (в левой части чередования). С правой стороны мы фиксируем все +
, которые не были нейтрализованы в Группе 1, и функция замены исследует Группу 1. Вот полный рабочий код:
<script>
var subject = '+bar+baz"not+these+"foo+bar+';
var regex = /"[^"]+"|(\+)/g;
replaced = subject.replace(regex, function(m, group1) {
if (!group1) return m;
else return "#";
});
document.write(replaced);
Демо онлайн
Вы можете использовать тот же принцип для сопоставления или разделения. См. Вопрос и статью в ссылке, в которой также будут указаны примеры кода.
Надеюсь, это даст вам другое представление об очень общем способе сделать это. :)
А как насчет пустых строк?
Выше приведен общий ответ для демонстрации техники. Его можно настроить в зависимости от ваших потребностей. Если вы беспокоитесь, что ваш текст может содержать пустые строки, просто измените квантификатор внутри выражения захвата строк с +
на *
:
"[^"]*"|(\+)
См. демо .
А как насчет кавычек?
Опять же, приведенный выше является общим ответом для демонстрации техники. Регулярное выражение " ignore this match " может быть уточнено не только для ваших нужд, но и для добавления нескольких выражений, которые можно игнорировать. Например, если вы хотите убедиться, что экранированные кавычки должным образом игнорируются, вы можете начать с добавления чередования \\"|
перед двумя другими, чтобы сопоставить (и игнорировать) запятые экранированные двойные кавычки.
Далее, в разделе "[^"]*"
, который захватывает содержимое строк в двойных кавычках, вы можете добавить чередование, чтобы обеспечить совпадение экранированных двойных кавычек до того, как их "
сможет превратиться в закрывающего стража, превратив его в "(?:\\"|[^"])*"
Полученное выражение имеет три ветви:
\\"
для соответствия и игнорировать
"(?:\\"|[^"])*"
для сопоставления и игнорирование
(\+)
для сопоставления, захват и обработка
Обратите внимание, что в других разновидностях регулярных выражений мы могли бы легче выполнять эту работу с lookbehind, но JS не поддерживает ее.
Полное регулярное выражение становится:
\\"|"(?:\\"|[^"])*"|(\+)
См. regex demo и полный скрипт .
Ссылка
- Как сопоставить шаблон с исключением ситуаций s1, s2, s3
- Как сопоставить шаблон, если ...