Java - 用于拆分目录路径的正则表达式

时间:2010-11-01 06:08:42

标签: java regex split

我正在尝试在Java中执行以下操作 给出像"/a/b/c"这样的目录路径我希望得到一个字符串数组["a", "b", "c"]。代码如下:

private static final String DIRECTORY_PATH_SEPARATOR = "/";  
    Iterator iter = testPaths.iterator();

            String[] directories;

        while( iter.hasNext() ) {

            directories = ( ( String ) iter.next() ).split(DIRECTORY_PATH_SEPARATOR);
        }

但我得到的数据也是空间。我希望用length>0获得所有这些字符串 我怎样才能做到这一点??

4 个答案:

答案 0 :(得分:4)

如果路径以分隔符开头,那么您获得空字符串(在有效路径中)的唯一位置将是第一个项目。如果它有前导分隔符,则在没有它的路径上拆分。

String path = "/a/b/c";
String[] directories = path.substring(1).split(DIRECTORY_PATH_SEPARATOR);
// { "a", "b", "c" }

如OmnipotentEntity所述,我对有效路径的假设是错误的。在使用split()时,你必须通过数组并保持非空字符串。

String path = "/a/b////c";
String[] split = path.split(DIRECTORY_PATH_SEPARATOR);
ArrayList<String> directories = new ArrayList<String>(split.length);
for (String dir : split)
    if (dir.length() > 0)
        directories.add(dir);

另一种方法是使用实​​际正则表达式来匹配非分隔符:

String path = "/a/b////c";
ArrayList<String> directories = new ArrayList<String>();
Pattern regex = Pattern.compile("[^" + DIRECTORY_PATH_SEPARATOR + "]+");
Matcher matcher = regex.matcher(path);
while (matcher.find())
    directories.add(matcher.group());

答案 1 :(得分:3)

您应该使用File类,而不是正则表达式。

答案 2 :(得分:1)

String.split(String)方法不是很灵活,其结果可能令人惊讶(例如,静默地丢弃空尾随字符串)。我正在为我的所有项目使用Guava libraries(Google核心库为Java),并且它包含一个非常好的Splitter实用程序,它以一种非常易读且可预测的方式执行您想要的操作:

String path = "/a/b///c///";
Iterable<String> directories = Splitter
    .on(DIRECTORY_PATH_SEPARATOR)
    .omitEmptyStrings()
    .split(path);

这为您提供了一个可以直接在for循环中使用的迭代:

for(String directory : directories) {
  System.out.println(directory);
}

在这种情况下,它甚至不创建存储目录的中间对象,但它会动态创建它们。

如果确实需要目录列表,可以将iterable复制到ArrayList或数组中,如下所示:

List<String> dirList = Lists.newArrayList(directories);
String[] dirArray = Iterables.toArray(directories, String.class);

作为结束语:要编写可移植代码,您应使用File.separator代替DIRECTORY_PATH_SEPARATOR

答案 3 :(得分:0)

这是一个使用文件系统例程的更可靠的非正则表达式版本:

public static List<String> splitFilePath(final File f){
    if(f == null){
        throw new NullPointerException();
    }
    final List<String> result = new ArrayList<String>();
    File temp = f.getAbsoluteFile();
    while(temp != null){
        result.add(0, temp.getName());
        temp = temp.getParentFile();
    }
    return result;
}

测试代码:

public static void main(final String[] args){
    final File f = new File("foo/bar/phleem.txt");
    final List<String> parts = splitFilePath(f);
    System.out.println(parts);
}

<强>输出:

  

[,home,seanizer,projects,eclipse,helios2,stackfiddler,foo,bar,phleem.txt]

我返回一个List,因为它更有用,但没有什么可以阻止你更改方法返回数组或使用它来转换外部结果:

List<String> parts = splitFilePath(f);
String[] partsAsArray = parts.toArray(new String[parts.size()]);