【问题标题】:Java replaceAll method with a variable string and escaped dot带有变量字符串和转义点的 Java replaceAll 方法
【发布时间】: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


【解决方案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

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

【讨论】:

  • 好的,谢谢。我意识到我错误地组合了我的regexRemoveRev 变量。非常感谢大家对此的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
相关资源
最近更新 更多