Java Regex捕获几个匹配项

时间:2013-07-24 22:14:18

标签: java regex

我有以下字符串,我想使用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());
    }

5 个答案:

答案 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];