Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式:删除字符最后一个实例之后的所有内容_Java_Regex - Fatal编程技术网

Java正则表达式:删除字符最后一个实例之后的所有内容

Java正则表达式:删除字符最后一个实例之后的所有内容,java,regex,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 =

假设我有一个字符串:

/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("");
你是说像这样吗

s = s.replaceAll("/[^/]*$", "");
如果您使用的是路径,则更好

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

如果您有一个包含字符的字符串(无论是否为补充代码点),则可以使用
模式。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()

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

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

我不知道为什么你要预付“$”。尝试以下任一方法:

  • 匹配起始组

    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();
    
  • 剥尾匹配:

    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("");
    

  • +1,不过,我认为OP想要提取它之前的一切。@damo你是对的;我已经更新了我的答案(和子字符串链接)。我想你的意思是
    replaceAll
    。@arshajii是的,replace()不做正则表达式。