0

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

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

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

但是我上面使用的 RegEx 必须动态创建(我要删除的字段可以在不同的位置)。因此,我使用了一些代码来创建 RegEx 字符串(如果我刚刚声明它,结果如下所示):

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

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

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

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

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

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

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

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

但是替换还是不行!

我怎样才能让它做我想做的事?

4

1 回答 1

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: ([^- .]+-[^- .]+-[^- .]+-[^- .]+-)[^- .]+ (.[^- .]+)
newStr: 02-EST-WHATEVER-099-.dwg

我不知道为什么不适合你!!还是您要问的其他问题,我错了

于 2012-12-20T14:25:14.133 回答