Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Clojure中使用正则表达式和反向引用替换字符串_Java_Regex_Clojure - Fatal编程技术网

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

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{

我正在尝试从HTML转换为Latex,并希望更改以下内容:

<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
,它有一个使用正则表达式的替换函数,但它似乎不处理反向引用。我错过什么了吗?走错方向了吗?非常感谢您的帮助。

()

两件事:

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

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

  • 因此:

    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"}]