我想删除包含一些代码的字符串末尾的子字符串。我有一个包含表达式"c=c+1"的向量 a我的目标是删除表达式末尾的表达式"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;"
如何更正我的(重新模式)功能?
谢谢。
用于构建正则表达式模式的字符串中有一些在正则表达式中具有特殊含义的字符。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;"
我从示例中的模式中删除了前导"# "
以使其正常工作,因为它不会出现在输入中。