Заменить конец строки на String / replace и заново нанести шаблон - Clojure - PullRequest
0 голосов
/ 03 января 2019

Я хочу удалить подстроку в конце строки, содержащей некоторый код.У меня есть вектор 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 голосов
/ 03 января 2019

Строка, которую вы используете для построения шаблона регулярного выражения, содержит несколько символов, которые имеют особое значение в регулярном выражении.+ в 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;"

Я удалил ведущий "# " из шаблона в вашем примере, чтобы сделать эту работу, потому чтоэто не появляется на входе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...