3

假设我有一个字符串:

/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

4 回答 4

10

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

于 2013-07-24T22:37:14.910 回答
5

你的意思是这样的

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

或者如果您使用路径更好

File f = new File(s);
File dir = f.getParent(); // works for \ as well.
于 2013-07-24T22:36:58.630 回答
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()
于 2013-07-24T22:37:06.163 回答
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("");
    
于 2013-07-24T23:14:29.167 回答