Java Regex:删除最后一个字符后的所有内容

时间:2013-07-24 22:35:34

标签: java regex

说我有一个字符串:

/first/second/third

我希望在/的最后一个实例之后删除所有内容,因此我最终会:

/first/second

我会使用什么正则表达式?我试过了:

String path = "/first/second/third";
String pattern = "$(.*?)/";
Pattern r = Pattern.compile(pattern2);
Matcher m = r.matcher(path);
if(m.find()) path = m.replaceAll("");

4 个答案:

答案 0 :(得分:10)

为什么要在这里使用正则表达式?使用lastIndexOf查找最后一个/字符。如果已找到,则使用substring提取所有内容。

答案 1 :(得分:5)

你的意思是这样吗

s = s.replaceAll("/[^/]*$", "");

如果您使用路径

,则更好
File f = new File(s);
File dir = f.getParent(); // works for \ as well.

答案 2 :(得分:1)

如果你有一个包含你的角色的字符串(无论是否是补充代码点),那么你可以使用Pattern.quote并将反向字符串匹配到最后:

String myCharEscaped = Pattern.quote(myCharacter);
Pattern pattern = Pattern.compile("[^" + myCharEscaped + "]*\\z");

应该这样做,但实际上你可以像在

中一样使用lastIndexOf
myString.substring(0, s.lastIndexOf(myCharacter) + 1)

要将代码点作为字符串获取,只需执行

new StringBuilder().appendCodePoint(myCodePoint).toString()

答案 3 :(得分:0)

尽管答案避免使用正则表达式模式和匹配器,但它对性能(编译模式)很有用,而且它非常简单并且值得掌握。 :)

不确定为什么你预先有“$”。尝试:

  1. 匹配起始组

    String path = "/first/second/third";
    String pattern = "^(.*)/";  // * = "greedy": maximum string from start to last "/"
    Pattern r = Pattern.compile(pattern2);
    Matcher m = r.matcher(path);
    if (m.find()) path = m.group();
    
  2. 剥离尾部匹配:

    String path = "/first/second/third";
    String pattern = "/(.*?)$)/"; // *? = "reluctant": minimum string from last "/" to end
    Pattern r = Pattern.compile(pattern2);
    Matcher m = r.matcher(path);
    if (m.find()) path = m.replace("");