Ersetzen Sie das Ende des Strings durch String/Replace und re-pattern - Clojure

Ich möchte einen Teilstring am Ende einer Zeichenfolge entfernen, die Code enthält. Ich habe einen Vektor a , der den Ausdruck "c = c + 1" enthält Mein Ziel ist es, den Ausdruck "c = c + 1;" am Ende meines Ausdrucks zu entfernen.

Ich habe das $ -Symbol verwendet, um anzuzeigen, dass der zu ersetzende Teilstring am Ende meines Codes stehen muss.

Hier ist der Code und die Ausgabe:

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

Die erwartete Ausgabe ist:

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

Wie kann ich meine (Re-Pattern-) Funktion korrigieren?

Vielen Dank.

0
ru

1 Antworten

Die Zeichenfolge, die Sie zum Erstellen des Regex-Musters verwenden, enthält einige Zeichen, die in einem regulären Ausdruck eine besondere Bedeutung haben. + in c + 1 wird als ein oder mehrere Vorkommen von c gefolgt von 1 . Javas Pattern -Klasse stellt eine Funktion bereit, um Strings zu maskieren, damit sie in Regex-Mustern buchstäblich verwendet werden können. Sie können es direkt verwenden oder eine Wrapperfunktion definieren:

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

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

Diese Funktion umschließt die Eingabezeichenfolge einfach in einige spezielle Steuerzeichen \ Q und \ E , damit der Interpreter das Zitieren des Inhalts starten und stoppen kann.

Jetzt können Sie diese Literalzeichenfolge verwenden, um ein Regex-Muster zu erstellen:

(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;"

Ich habe das führende "#" aus dem Muster in Ihrem Beispiel entfernt, damit dies funktioniert, da dies in der Eingabe nicht angezeigt wird.

1
hinzugefügt