Азмисов, воскресив этот вопрос, потому что вы сказали, что ищете 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);
Online demo
Вы можете использовать тот же принцип для сопоставления или разделения. См. Вопрос и статью в справочнике, где также будут указаны образцы кода.
Надеюсь, это даст вам другое представление об очень общем способе этого. :)
А что насчет пустых строк?
Вышеупомянутое является общим ответом на демонстрацию техники. Его можно настроить в зависимости от ваших конкретных потребностей. Если вы беспокоитесь, что ваш текст может содержать пустые строки, просто измените квантификатор внутри выражения захвата строки с +
на *
:
"[^"]*"|(\+)
См. демонстрацию.
А как насчет скрытых цитат?
Опять же, приведенное выше является общим ответом для демонстрации техники. Регулярное выражение «игнорировать это совпадение» можно не только изменить в соответствии с вашими потребностями, но и добавить несколько выражений, которые следует игнорировать. Например, если вы хотите убедиться, что экранированные кавычки должным образом игнорируются, вы можете начать с добавления чередования \\"|
перед двумя другими, чтобы сопоставить (и игнорировать) случайные экранированные двойные кавычки.
Затем в разделе "[^"]*"
, который захватывает содержимое строк в двойных кавычках, вы можете добавить чередование, чтобы гарантировать совпадение экранированных двойных кавычек до того, как их "
сможет превратиться в закрывающую сигнальную метку, превратив ее в "(?:\\"|[^"])*"
Результирующее выражение имеет три ветви:
\\"
для соответствия и игнорирования
"(?:\\"|[^"])*"
для соответствия и игнорирования
(\+)
для сопоставления, захват и обработка
Обратите внимание, что в других вариантах регулярных выражений мы могли бы легче выполнять эту работу с помощью ретроспективного просмотра, но JS не поддерживает его.
Полное регулярное выражение становится:
\\"|"(?:\\"|[^"])*"|(\+)
См. демонстрацию регулярных выражений и полный сценарий.
Ссылка
- Как сопоставить шаблон, кроме ситуаций s1, s2, s3
- Как сопоставить шаблон, если ...
person
zx81
schedule
15.05.2014