将字符串结尾替换为字符串/替换并重新设置样式-Clojure

时间:2019-01-03 19:02:39

标签: regex clojure

我想在包含某些代码的字符串的末尾删除子字符串。 我有一个向量 a ,其中包含表达式“ c = c + 1” 我的目标是删除表达式结尾处的表达式“ c = c + 1;”

我已经使用 $ 符号表示要替换的子字符串必须在代码的末尾。

这是代码和输出:

project.core=> (def a [:LangFOR [:before_for "a=0; b="] [:init_var "c=a+1;"] [:loop_condition_expression "c-10;"] [:loop_var_step "c=c+1"] [:statements_OK "a=2*c;"] [:after_for " b+c;"]])
#'project.core/a
project.core=> (prn (str "REGEX debug : " (clojure.string/replace "b=0;c=a+1;a=2*c;c=c+1;c=c+1;a=2*c;c=c+1;" (re-pattern (str "# "(get-in a [4 1]) ";$")) "")))
"REGEX debug : b=0;c=a+1;a=2*c;c=c+1;c=c+1;a=2*c;c=c+1;"
nil

预期输出为:

"REGEX debug : b=0;c=a+1;a=2*c;c=c+1;c=c+1;a=2*c;"

如何纠正我的(重新模式)功能?

谢谢。

1 个答案:

答案 0 :(得分:4)

用于构建正则表达式模式的字符串中包含一些在正则表达式中具有特殊含义的字符。 +中的c+1被解释为一次或多次出现c,后跟1 。 Java的Pattern类提供了对字符串进行转义/引用的功能,因此可以在正则表达式模式中使用它们。您可以直接使用它,也可以定义包装函数:

(defn re-quote [s]
  (java.util.regex.Pattern/quote s))

(re-quote "c=c+1")
=> "\\Qc=c+1\\E"

此函数只是将输入字符串包装在一些特殊的控制字符\Q\E中,以使解释器开始和停止对内容的引用。

现在,您可以使用该文字字符串来构建正则表达式模式:

(clojure.string/replace
  "b=0;c=a+1;a=2*c;c=c+1;c=c+1;a=2*c;c=c+1;"
  (re-pattern (str (re-quote "c=c+1;") "$"))
  "")
=> "b=0;c=a+1;a=2*c;c=c+1;c=c+1;a=2*c;"

我从示例中的模式中删除了前导"# ",以使其正常工作,因为该内容未出现在输入中。