我有以下字符串,我想使用java正则表达式获得以下结果。
String s = "/accounts/main/index/page.txt"
String[] result = {"/accounts/", "/accounts/main/", "/accounts/main/index/"};
也就是说,我想获得'父目录层次结构'(这不一定是一个目录结构)。
注意:字符串“s”是动态分配的,因此它可能是不同级别的目录。
我有以下内容,但我不确定如何编译将返回我想要的正则表达式。我知道我想要的只能返回一个结果,即数组中的最后一个条目:
Pattern p = Pattern.compile("^/.+/"); //how do i set up this regex to give me required results.
String s = "/accounts/main/index/page.xhtml";
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(m.group());
}
答案 0 :(得分:3)
我不会使用正则表达式。
的内容如何?String[] split = s.split("/");
StringBuilder sb = new StringBuilder(s.lastIndexOf('/') + 1); // our result
sb.append('/'); // initial "/"
for (int i = 0; i < split.length - 1; i++) { // we don't care about the
if (split[i].isEmpty()) // last component
continue;
sb.append(split[i]);
sb.append('/');
System.out.println(sb); // or add to an array/list/etc.
}
/accounts/ /accounts/main/ /accounts/main/index/
答案 1 :(得分:2)
你问的是不可能的; find
的工作方式,每个匹配只能在上一个匹配结束后匹配。但是,你可以写:
final Pattern p = Pattern.compile("[^/]/");
final String s = "/accounts/main/index/page.xhtml";
final Matcher m = p.matcher(s);
while (m.find()) {
System.out.println(s.substring(0, m.end()));
}
或者,获得一个数组:
final Pattern p = Pattern.compile("[^/]/");
final String s = "/accounts/main/index/page.xhtml";
final Matcher m = p.matcher(s);
final List<String> resultList = new ArrayList<String>();
while (m.find()) {
resultList.add(s.substring(0, m.end()));
}
final String[] resultArr = resultList.toArray(new String[resultList.size()]);
(免责声明:未经测试。)
答案 2 :(得分:1)
另一种方式:
Pattern p = Pattern.compile("/[^/]+");
String s = "/accounts/main/index/page.xhtml";
String dir = "";
Matcher m = p.matcher(args[0]);
while(m.find()){
dir += m.group();
System.out.println(dir + "/");
}
答案 3 :(得分:0)
实际上可以使用正则表达式来实现它,这将适用于您的示例:
Pattern p = Pattern.compile("^(((/[^/]+/)[^/]+/)[^/]+/)");
String s = "/accounts/main/index/page.xhtml";
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
然而,你不能有一个匹配每一个案例的正则表达式。但是,由于常规表达式的结构已经明确定义,您可以根据目录结构的深度来实时构建它,然后每次编译它。
答案 4 :(得分:0)
正则表达式最初可以拆分,但你必须添加一些代码:
String parts = a.split("(?<!^)(?=/)");
for (int i = 0; i < parts.length - 2; i++)
parts[i + 1] = parts[i] + parts[i + 1];