Java replaceAll方法,带有变量字符串和转义点

时间:2012-12-20 13:53:01

标签: java string variables escaping replaceall

我很难搞清楚这个,所以我请求你的帮助。这是交易:

String str = "02-EST-WHATEVER-099-00.dwg";
String newStr = str.replaceAll("([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)", "$1$2");

上面的代码块导致02-EST-WHATEVER-099-.dwg(在扩展名之前删除了最后一个“00”)。 太棒了,这就是我的需要!

但我上面使用的RegEx必须动态创建(我正在删除的字段可以处于不同的位置)。所以我使用了一些代码来创建RegEx字符串(如果我刚刚声明它,结果会是什么样子):

String regexRemoveRev = "([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)";

现在,如果我out.print(regexRemoveRev),我得到([^-_\.]+-[^-_\.]+-[^-_\.]+-[^-_\.]+-)[^-_\.]+(\.[^-_\.]+)(注意单个反斜杠)。

当我再次尝试replaceAll时,它不起作用:

String str = "02-EST-WHATEVER-099-00.dwg";
String newStr = str.replaceAll(regexRemoveRev, "$1$2");

所以我认为这可能是因为单个反斜杠,我尝试用其中4个声明regexRemoveRev,而不仅仅是2:

String regexRemoveRev = "([^-_\\\\.]+-[^-_\\\\.]+-[^-_\\\\.]+-[^-_\\\\.]+-)[^-_\\\\.]+(\\\\.[^-_\\\\.]+)";

out.print(regexRemoveRev)的输出是RegEx的双反斜杠版本,正如预期的那样:

([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)

但替换仍然不起作用!

如何让它做我想做的事?

1 个答案:

答案 0 :(得分:1)

我刚刚写了一个简短的程序,在这两种情况下它的工作原理是:

public class StringTest 
{  

    public static void main(String[] args) 
    {  
        String str = "02-EST-WHATEVER-099-00.dwg";

        String newStr = str.replaceAll("([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)", "$1$2");

        String regexRemoveRev = "([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)";

        String newStr1 = str.replaceAll(regexRemoveRev, "$1$2");

        System.out.println("newStr: "+newStr);
        System.out.println("regexRemoveRev: "+regexRemoveRev);
        System.out.println("newStr: "+newStr1);

    }  
} 

以上的输出:

newStr:02-EST-WHATEVER-099-.dwg
regexRemoveRev:([^ - 。] + - [^ - 。] + - [^ - 。] + - [^ - 。] + - )[^ - < EM>] +。([^ - 。] +)
newStr:02-EST-WHATEVER-099-.dwg

我不确定为什么不为你工作!!或者是你要问的其他事情我错了