说我有一个字符串:
/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("");
答案 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)
尽管答案避免使用正则表达式模式和匹配器,但它对性能(编译模式)很有用,而且它非常简单并且值得掌握。 :)
不确定为什么你预先有“$”。尝试:
匹配起始组
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("");