Java 在Clojure中使用正则表达式和反向引用替换字符串
我正在尝试从HTML转换为Latex,并希望更改以下内容:Java 在Clojure中使用正则表达式和反向引用替换字符串,java,regex,clojure,Java,Regex,Clojure,我正在尝试从HTML转换为Latex,并希望更改以下内容: <a href="www.foo.com/bar">baz</a> 我想生成一个Clojure函数来获取文本块,并替换给定段落中存在的尽可能多的匹配项 我试过了 (.replaceAll "<a href=\"foo.com\">baz</a>" "<a.*href=\"(.*)\">(.*)</a>" "\2\\footnote{
<a href="www.foo.com/bar">baz</a>
我想生成一个Clojure函数来获取文本块,并替换给定段落中存在的尽可能多的匹配项
我试过了
(.replaceAll
"<a href=\"foo.com\">baz</a>"
"<a.*href=\"(.*)\">(.*)</a>"
"\2\\footnote{\1}")
我还研究了
clojure.contrib.str-utils2
,它有一个使用正则表达式的替换函数,但它似乎不处理反向引用。我错过什么了吗?走错方向了吗?非常感谢您的帮助。()
两件事:
$1
,$2
来引用捕获组,而不是\1
,\2
#“
有一些魔力,可以为您节省一些反斜杠,但普通字符串没有这种魔力user>(.replaceAll“”
""
“$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}"
user>(require'(clojure.contrib[str-utils2:as s]))
无
用户>(s/replace“”
#""
(fn[[url txt]]
(str txt“\\\\footnote{“url”}”))
“baz\\footnote{www.foo.com/bar}”
“\2”
是一个控制字符(ASCII字符2),因此它显示为^B
。与执行(char 2)
几乎相同,如果您想变得真正时髦,可以使用clojure.xml。它将返回一个结构树,您可以随意修改。您上面的示例如下所示:
{:tag :a :attrs {:href "www.foo.com/bar"} :content ["bar"]}
这可以很容易地转化为:
["bar" {:footnote "www.foo.com/bar"}]
它可以很容易地序列化回您想要的形式。最好的部分是:没有无法维护的正则表达式。:)YMMV当然……关于下面的答案中提到的对正则表达式和HTML的不幸选择,我原谅自己说这是一个一次性的程序,源代码是我之前通过编程生成的。我认为xml解决方案是实现可持续性和可重用性的正确方法,但现在我只是尝试将其结合起来。是否有理由选择.replace而不是s/replace选项,或者反之亦然?看起来它们都应该工作,但一个有更高的处理要求,还是一个更习惯于Clojure?在功能相同的情况下,最佳做法是什么?
clojure.contrib.str-utils2/replace
做得更多(您可以将fn作为第三个参数传入)。但这是对您的项目的附加依赖。使用这两种语言都是惯用的,您不必回避Java调用。就我个人而言,大多数事情我都使用strutils
。
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}"
{:tag :a :attrs {:href "www.foo.com/bar"} :content ["bar"]}
["bar" {:footnote "www.foo.com/bar"}]