Clojure stripMargin - PullRequest
       8

Clojure stripMargin

5 голосов
/ 06 октября 2010

Scala предлагает метод stripMargin, который удаляет левую часть многострочной строки до указанного разделителя (по умолчанию: «|»).Вот пример:

"""|Foo
   |Bar""".stripMargin

возвращает строку

Foo
Bar

Есть ли подобная функция в Clojure?Если нет, то как бы вы реализовали это (наиболее функционально)?

Спасибо.

ОБНОВЛЕНИЕ : Пример, который я привел, не завершен.Метод stripMargin также сохраняет пробелы после разделителя:

"""|Foo
   |   Bar""".stripMargin

возвращает строку

Foo
   Bar

Ответы [ 4 ]

4 голосов
/ 06 октября 2010

Нет такой встроенной функции, но вы легко пишете:

user=> (use '[clojure.contrib.string :only (join, split-lines, ltrim)]) //'
nil
user=> (->> "|Foo\n  |Bar" split-lines (map ltrim) 
  (map #(.replaceFirst % "\\|" "")) (join "\n"))
"Foo\nBar"
2 голосов
/ 06 октября 2010

Вот мое полное решение, собранное из ответов выше:

(use '[clojure.contrib.string :only (join, split-lines, ltrim)])

(defn strip-margin
  ([s d] (->> s split-lines (map ltrim) (map #(.replaceFirst % d "")) (join "\n")))
  ([s] (strip-margin s "\\|")))

Вот некоторые «реальные» примеры ввода и вывода:

(println
  (strip-margin "|<?xml version='1.0' encoding='utf-8'?>
                 |<people>
                 |  <person>
                 |    <name>Joe Smith</name>
                 |  </person>
                 |</people>"))

==>

<?xml version='1.0' encoding='utf-8'?>
<people>
  <person>
    <name>Joe Smith</name>
  </person>
</people>
nil

Спасибо всем авторам.

2 голосов
/ 06 октября 2010

Быстрое поиск в Google не вернул ни одной из существующих функций, но вот моя попытка решить эту проблему.Он не поддерживает пользовательские разделители и не очень оптимизирован по скорости.

(use '[clojure.contrib.str-utils :only (re-split re-sub str-join)])

(defn strip-margin [s]
  (let [lines (seq (re-split #"\n" s))]
    (str-join "\n"
      (for [line lines]
        (re-sub #"^\s*\|" "" line)))))
1 голос
/ 07 октября 2010

Вы также можете сделать это с помощью одного регулярного выражения:

(use '[clojure.contrib.string :only (replace-re)])

(def test-string 
"|<?xml version='1.0' encoding='utf-8'?>
                 |<people>
                 |  <person>
                 |    <name>Joe Smith</name>
                 |  </person>
                 |</people>")


(replace-re #"(^\|)|(.+\|)" "" test-string))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...