替换字符串中的反向引用语法(为什么要用美元符号?)
问题内容:
在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设计一种新的语言或新的正则表达式库。