在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使用吗?如果不是,哪种语言开始使用它?哪些模式使用了它而哪些没有? - 为什么这是一个好主意?为什么不坚持相同的模式语法呢?这难道不会导致语言更加协调和容易学习吗?
- 如果上述语句中的1和4是“正确”的语句而不是2和3,那么语法是否会更加简洁?
\1
和\2
是八进制转义序列,分别描述了八进制数字1和2所代表的字符(请参见http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#101089)。这就是为什么您需要不同的引用语法。 - Gumbo