Одна проблема с предлагаемыми решениями состоит в том, что они не распознают правильно цитируемые части в тексте.
Давайте назовем цитируемые части, начинающиеся с #
или :
, «специальными», а остальные"non-special".
Например, в тексте "a"#b"c"
, "#b"
распознается как особая часть и создается "a#bc"
, тогда как "a"
и "c"
должны распознаватьсякак не специальные части, а текст следует оставить без изменений.
Другая проблема заключается в том, что экранирование "
и \
внутри указанных частей не обрабатывается.
Одно из возможных решений, котороеучитывает следующие проблемы:
(defn remove-quotes [s]
(clojure.string/replace s
#"\"([#:]?)(?:([^\"\\]+)|\\([\"\\]))*\""
#(if (empty? (second %)) (first %) (apply str (rest %)))))
РЕДАКТИРОВАТЬ :
После прочтения ответа Тейлора Вуда, который касается только ограниченного случая, я решил добавить нет-regex решение (которое не обрабатывает выход):
(defn remove-quotes [s]
(loop [processed "" remaining s]
(if-let [i (clojure.string/index-of remaining \u0022)]
(let [j (clojure.string/index-of remaining \u0022 (inc i))]
(recur
(str processed
(subs remaining 0 i)
(apply subs remaining
(if (#{\# \:} (get remaining (inc i)))
[(inc i) j]
[i (inc j)])))
(subs remaining (inc j))))
(str processed remaining))))
\u0022
- это просто \"
.Последний портит внешний вид кода в переполнении стека.