gpt4 book ai didi

java - 在 Clojure 中使用正则表达式和反向引用替换字符串

转载 作者:行者123 更新时间:2023-11-30 06:38:47 24 4
gpt4 key购买 nike

我正在尝试将 HTML 转换为 Latex,并希望对此进行更改:

<a href="www.foo.com/bar">baz</a> 

进入:

baz\footnote{www.foo.com/bar}

我想生成一个 Clojure 函数来获取一段文本,并替换给定段落中存在的尽可能多的匹配项。

我试过了

(.replaceAll 
"<a href=\"foo.com\">baz</a>"
"<a.*href=\"(.*)\">(.*)</a>"
"\2\\footnote{\1}")

但是返回:

"^Bfootnote{^A}"

我还看过 clojure.contrib.str-utils2,它有一个使用正则表达式的替换函数,但它似乎不处理反向引用。我错过了什么吗?以错误的方式解决这个问题?感谢您的帮助。

最佳答案

( You should not parse HTML with a regex... )

两件事:

  1. Java 使用$1$2 来引用捕获组,而不是\1\2.

  2. 您需要在替换文本中使用更多反斜杠。第一级反斜杠由 Clojure 阅读器使用,因为它是一个文字字符串。第二级反斜杠由正则表达式使用。不幸的是,Clojure 没有“原始”字符串文字的通用语法(还没有?)。 Clojure 文字正则表达式语法 #"" 可以为您节省一些反斜杠,但普通字符串没有这种魔力。

所以:

user> (.replaceAll "<a href=\"www.foo.com/bar\">baz</a>"
"<a.*href=\"(.*)\">(.*)</a>"
"$2\\\\footnote{$1}")
"baz\\footnote{www.foo.com/bar}"

你也可以这样做:

user> (require '(clojure.contrib [str-utils2 :as s]))
nil
user> (s/replace "<a href=\"www.foo.com/bar\">baz</a>"
#"<a.*href=\"(.*)\">(.*)</a>"
(fn [[_ url txt]]
(str txt "\\\\footnote{" url "}")))
"baz\\footnote{www.foo.com/bar}"

"\2" 是一个控制字符(ASCII 字符 2),这就是它显示为 ^B 的原因。几乎与执行 (char 2) 相同。

关于java - 在 Clojure 中使用正则表达式和反向引用替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com