Азмисов, възкресявам този въпрос, защото казахте, че търсите 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
Можете да използвате същия принцип за съпоставяне или разделяне. Вижте въпроса и статията в препратката, която също ще ви посочи примерни кодове.
Надяваме се, че това ви дава различна представа за много общ начин да направите това. :)
Ами празните низове?
Горното е общ отговор за демонстриране на техниката. Може да се променя в зависимост от вашите точни нужди. Ако се притеснявате, че текстът ви може да съдържа празни низове, просто променете квантора вътре в израза за улавяне на низ от +
на *
:
"[^"]*"|(\+)
Вижте демонстрация.
Какво ще кажете за Escaped Quotes?
Отново, горното е общ отговор за демонстриране на техниката. Не само, че регулярният израз „игнорирайте това съвпадение“ може да бъде прецизиран според вашите нужди, можете да добавите множество изрази, които да игнорирате. Например, ако искате да сте сигурни, че екранираните кавички са адекватно игнорирани, можете да започнете с добавяне на редуване \\"|
пред другите две, за да съпоставите (и игнорирате) екранираните двойни кавички.
След това в раздела "[^"]*"
, който улавя съдържанието на низове в двойни кавички, можете да добавите алтернатива, за да гарантирате, че екранираните двойни кавички са съпоставени, преди техният "
да има шанс да се превърне в затварящ страж, превръщайки го в "(?:\\"|[^"])*"
Полученият израз има три клона:
\\"
за съпоставяне и игнориране
"(?:\\"|[^"])*"
за съпоставяне и игнориране
(\+)
за съвпадение, улавяне и обработка
Обърнете внимание, че в други разновидности на регулярен израз бихме могли да свършим тази работа по-лесно с lookbehind, но JS не го поддържа.
Пълният регулярен израз става:
\\"|"(?:\\"|[^"])*"|(\+)
Вижте демонстрация на regex и пълният скрипт.
Справка
- Как да съпоставим шаблон освен в ситуации s1, s2, s3
- Как да съпоставите модел, освен ако...
person
zx81
schedule
15.05.2014