我很难搞清楚这个,所以我请求你的帮助。这是交易:
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的双反斜杠版本,正如预期的那样:
([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)
但替换仍然不起作用!
如何让它做我想做的事?
答案 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
我不确定为什么不为你工作!!或者是你要问的其他事情我错了