Java:在特殊字符后从String获取子字符串

时间:2015-11-25 22:22:25

标签: java string substring

我有一个字符串:

/abc/def/ghfj/ijk/lmn.doc

我想从中提取 ghfj

我试着这样做:str.substring(str.indexOf("/",9),str.indexOf("/"));

有人可以提供一些帮助吗?

2 个答案:

答案 0 :(得分:1)

假设您正在尝试查找指定文件的父位置,最简单的方法是使用File类或Path而不是String方法。您的代码将更具可读性,可能更安全。

使用java.io.File

String location = "/abc/def/ghfj.doc";

File f = new File(location);
String parentName = f.getParentFile().getName();

System.out.println(parentName);

使用java.nio.file.Path

String location = "/abc/def/ghfj.doc";

Path p = Paths.get(location);
String parent = p.getParent().getFileName().toString();

System.out.println(parent);

两种情况下的输出:def

如果在def中选择/abc/def/ghfj/ijk/lmn.doc,您可以使用Path#getName(N),其中N是从最远的祖先到所选文件的基于零的索引,如{{1} } abc0def,...

所以你的代码看起来像:

1

答案 1 :(得分:0)

使用正则表达式和组的快速而肮脏的解决方案:

public class AClass {

    private static final String TEXT = "/abc/def/ghfj/ijk/lmn.doc";
    private static final String REGULAR_EXPRESSION = "(/[^/]*){2}/([^/]*)/.*";

    public static void main(final String[] args) {
        final Pattern pattern = Pattern.compile(REGULAR_EXPRESSION);
        final Matcher matcher = pattern.matcher(TEXT);
        if (matcher.matches()) {
            // the following variable holds "ghfj"
            String value = matcher.group(2);
            System.out.println(value);
        }
    }
}

现在你需要更加精确,以便我们能够根据你的具体需要微调正则表达式。

编辑:我根据您自己的编辑编辑了解决方案。正则表达式必须理解如下:

  • (/[^/]*){2}:字符/的两倍,后跟除/
  • 之外的任何字符
  • /:另一个/字符
  • ([^/]*):一组不包含/
  • 的字符
  • /.*/字符,后跟任何其他字符

然后matcher.group(2)返回由上述正则表达式的([^/]*)部分表示的组所持有的字符串。