替换字符串中的反向引用语法(为什么要用美元符号?)


问题内容

在Java中,它似乎在少数其他语言,在模式的反向引用由一个反斜杠(如前面\1\2\3,等),但在替换字符串他们前面加一个美元符号(例如$1$2$3,和也$0)。

这是一个片段说明:

System.out.println(
    "left-right".replaceAll("(.*)-(.*)", "\\2-\\1") // WRONG!!!
); // prints "2-1"

System.out.println(
    "left-right".replaceAll("(.*)-(.*)", "$2-$1")   // CORRECT!
); // prints "right-left"

System.out.println(
    "You want million dollar?!?".replaceAll("(\\w*) dollar", "US\\$ $1")
); // prints "You want US$ million?!?"

System.out.println(
    "You want million dollar?!?".replaceAll("(\\w*) dollar", "US$ \\1")
); // throws IllegalArgumentException: Illegal group reference

问题:

  • $Java特有的替换字符串中使用for反向引用吗?如果没有,用什么语言开始的?什么口味使用它,什么不使用?
  • 为什么这是个好主意?为什么不坚持相同的模式语法?那会不会导致语言的衔接性和易学性?
    • 如果上面的语句1和4是“正确的”而不是2和3,语法是否会更加简化?

问题答案:

使用$作为Java特有的替换字符串中的反向引用吗?

不。Perl使用它,Perl肯定早于Java的Pattern类。Java的regex支持是用Perl regexes明确描述的。

例如:http :
//perldoc.perl.org/perlrequick.html#Search-and-
replace

为什么这是个好主意?

好吧,显然您认为这不是一个好主意!但是,这是一个好主意的原因之一是使Java搜索/替换支持(更多)与Perl兼容。

还有另一个 可能的 原因,为什么它$可能被视为比更好的选择\。那就是\必须以\\Java String文字形式编写。

但是,所有这些都是纯粹的猜测。做出设计决定时,我们没人在房间里。最终,他们以这种方式设计替换String语法并不重要。这些决定已经制定并具体确定,任何进一步的讨论都是纯学术性的……除非您碰巧正在为Java设计一种新的语言或新的正则表达式库。