Xml Clojure条纹边缘

Xml Clojure条纹边缘,xml,scala,string,clojure,Xml,Scala,String,Clojure,Scala提供了一个名为stripMargin的方法,该方法可以将多行字符串的左侧部分删除到指定的分隔符(默认值为“|”)。以下是一个例子: """|Foo |Bar""".stripMargin 返回字符串 Foo Bar Foo Bar Clojure中是否有类似的功能?如果没有,您将如何实现它(最重要的功能) 谢谢 更新:我给出的示例不完整。stripMargin方法还保留分隔符后的空白: """|Foo | Bar""".stripMargin 返回字符串

Scala提供了一个名为stripMargin的方法,该方法可以将多行字符串的左侧部分删除到指定的分隔符(默认值为“|”)。以下是一个例子:

"""|Foo
   |Bar""".stripMargin
返回字符串

Foo
Bar
Foo
   Bar
Clojure中是否有类似的功能?如果没有,您将如何实现它(最重要的功能)

谢谢

更新:我给出的示例不完整。stripMargin方法还保留分隔符后的空白:

"""|Foo
   |   Bar""".stripMargin
返回字符串

Foo
Bar
Foo
   Bar

快速谷歌搜索并没有返回任何现有函数,但下面是我对这个问题的尝试。它不支持自定义分隔符,而且速度方面也不是很优化

(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)))))

没有内置此类函数,但您可以轻松编写:

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"

下面是我的完整解决方案,从上面的答案中收集:

(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>"))
(println
(条边距)|
|
|  
|乔·史密斯
|  
|"))
==>


乔-史密斯
无

感谢所有贡献者。

您也可以使用单个regexp完成此操作:

(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))
(使用“[clojure.contrib.string:仅限(替换re)])
(def测试字符串
"|
|
|  
|乔·史密斯
|  
|")
(替换为“测试字符串”)

请注意,Scala的
stripMargin
可用于任何分隔符字符,但它也希望该字符是行中的第一个非空字符。@abhinv4:请参阅上面的“我的更新”。这似乎支持分隔符后面的前导空格:
(>“|Foo\n | Bar”分割行(map#)(.replaceFirst%“^\\s*\\\\\”“”)(join“\n”)
=>“Foo\n Bar”@Ralph:“这似乎支持分隔符后面的前导空格。”根据你的问题,这不是你想要的吗?@Daniel:我没有看Scala的
stripMargin
。我只是使用了OP给出的例子。@abhin4v:我不想去掉分隔符后面的空格。这个函数允许我在多行字符串中输入缩进的XML,并且仍然保留缩进。我的答案是使用
ltrim
去除分隔符前的空白。但是,我喜欢这个函数,正如Jamie Zawinski所说的:“有些人在遇到问题时会认为“我知道,我会使用正则表达式。”现在他们有两个问题。”:-)我同意,在过去的几天里,我一直在使用regexp,而且很容易击中自己的腿。。。虽然这个网站有帮助