Строка, которую вы используете для построения шаблона регулярного выражения, содержит несколько символов, которые имеют особое значение в регулярном выражении.+
в c+1
интерпретируется как один или несколько вхождений c
, за которыми следует 1
.Класс Pattern
в Java предоставляет функцию для экранирования / цитирования строк, чтобы их можно было использовать буквально в шаблонах регулярных выражений.Вы можете использовать его напрямую или определить функцию-обертку:
(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;"
Я удалил ведущий "# "
из шаблона в вашем примере, чтобы сделать эту работу, потому чтоэто не появляется на входе.