【问题标题】:Clojure. Using Regex to replace sub-strings with the same number of characters克洛朱尔。使用正则表达式替换具有相同字符数的子字符串
【发布时间】:2020-02-16 00:52:38
【问题描述】:

当子字符串被星号包围时,我需要替换空格的字符:

(def my-line "Lorem ipsum dolor, *consetetur*, invidunt ut *labore et dolore magna aliquyam* erat")

(clojure.string/replace my-line #"\*(.*?)\*" "    ")

但我的代码很笨,设置了静态数量的空格,我需要用空格替换相同数量的字符:

consetetur = 9 spaces
labore et dolore magna aliquyam = 31 

【问题讨论】:

  • 你不能用正则表达式来做到这一点。您需要检查匹配项并“手动”创建包含空格的字符串。
  • clojure.string/replace 允许最后一个参数是您编写的函数,它获取有关匹配的信息,并计算作为替换的返回值。例如(clojure.string/replace my-line #"\*(.*?)\*" (fn [match-info] (str (count (match-info 1))))) => "Lorem ipsum dolor, 10, invidunt ut 31 erat"
  • 我认为如果你给出一个你期望的完整输出的例子,你所要求的会更清楚,例如""Lorem ipsum dolor, 10, invidunt ut 31 erat"

标签: clojure clojurescript


【解决方案1】:

解决方案。

正如 andy_fingerhut 提到的,当正则表达式捕获了一组字符时,会创建并传递一个向量:

 (clojure.string/replace my-line #"\*(.*?)\*" #(.toUpperCase (%1 1)))
=> "Lorem ipsum dolor sit amet, CONSETETUR, tempor invidunt ut LABORE ET DOLORE MAGNA ALIQUYAM erat, sed diam"

所以在我的情况下:

(clojure.string/replace my-line #"\*(.*?)\*" 
       #(clojure.string/join (take (count (% 1)) (repeat " "))))
=> "Lorem ipsum dolor sit amet,           , tempor invidunt ut                                 erat, sed diam"

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2012-04-26
    相关资源
    最近更新 更多