【发布时间】:2012-12-20 13:53:01
【问题描述】:
我很难弄清楚这一点,所以我请求你的帮助。这是交易:
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 个而不是 2 个来声明 regexRemoveRev:
String regexRemoveRev = "([^-_\\\\.]+-[^-_\\\\.]+-[^-_\\\\.]+-[^-_\\\\.]+-)[^-_\\\\.]+(\\\\.[^-_\\\\.]+)";
out.print(regexRemoveRev) 的输出是正则表达式的双反斜杠版本,正如预期的那样:
([^-_\\.]+-[^-_\\.]+-[^-_\\.]+-[^-_\\.]+-)[^-_\\.]+(\\.[^-_\\.]+)
但是替换还是不行!
我怎样才能让它做我想做的事?
【问题讨论】:
-
天啊,有人明白这个问题吗?请更具体地说明您要实现的目标!顺便说一句,在这种情况下,使用“split-modify array of Strings-rejoin”操作会不会更好?
-
它可以工作并删除最后两位数字,请检查您的代码
-
@ppeterka 这真的没有帮助。你不明白什么?字符串中的破折号 (
-) 也可以是点 (.) 或下划线 (_),因此我相信拆分数组会更加困难。 @hoaz 哪个版本适合你?没有一个对我有用。 -
“现在,如果我 out.print(regexRemoveRev),我会得到
([^-_\.]+-[^-_\.]+-[^-_\.]+-[^-_\.]+-)[^-_\.]+(\.[^-_\.]+)(注意单个反斜杠)。” - 没错,字符串文字中的双反斜杠会在结果String中产生一个反斜杠。但请注意,在[]表达式中,您根本不需要反斜杠转义点,因为特殊字符在字符类中并不特殊。 -
@hoaz 好的。我明白我做错了什么。您的意见很有帮助。非常感谢!
标签: java string variables escaping replaceall