相关疑难解决方法(0)

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

在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
Run Code Online (Sandbox Code Playgroud)

问题:

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

java regex syntax backreference replace

47
推荐指数
2
解决办法
3万
查看次数

perl正则表达式警告:\ 1最好在(eval 1)第1行写为$ 1

use strict;
use warnings;

my $newPasswd = 'abc123';
my @lines = ( "pwd = abc", "pwd=abc", "password=def", "name= Mike" );

my %passwordMap = (
    'pwd(\\s*)=.*'      => 'pwd\\1= $newPasswd',
    'password(\\s*)=.*' => 'password\\1= $newPasswd',
);

print "@lines\n";

foreach my $line (@lines) {
    while ( my ( $key, $value ) = each(%passwordMap) ) {
        if ( $line =~ /$key/ ) {
            my $cmdStr = "\$line =~ s/$key/$value/";
            print "$cmdStr\n";
            eval($cmdStr);
            last;
        }
    }
}

print "@lines";
Run Code Online (Sandbox Code Playgroud)

运行它会给我正确的结果:

pwd = abc pwd=abc password=def name= …
Run Code Online (Sandbox Code Playgroud)

syntax perl warnings

3
推荐指数
1
解决办法
3715
查看次数

标签 统计

syntax ×2

backreference ×1

java ×1

perl ×1

regex ×1

replace ×1

warnings ×1