代码之家  ›  专栏  ›  技术社区  ›  daydreamer

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

  •  5
  • daydreamer  · 技术社区  · 14 年前


    提供如下目录路径 "/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 回复  |  直到 14 年前
        1
  •  4
  •   Jeff Mercado    14 年前

    如果路径以分隔符开头,则只有在第一个项目处会得到空字符串(在有效路径中)。如果它有前导分隔符,则在没有它的路径上拆分。

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

    正如全能实体所指出的,我对有效路径的假设是错误的。否则,在使用 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());
    
        2
  •  3
  •   user207421    14 年前

    您应该为此使用File类,而不是regex。

        3
  •  1
  •   MForster    14 年前

    这个 String.split(String) 方法不是非常灵活,其结果可能令人惊讶(例如,默默丢弃空拖尾字符串)。我正在使用 Guava libraries (googlecorebrariesforjava)用于我的所有项目,其中包含一个非常好的 Splitter 以非常可读和可预测的方式执行所需操作的实用程序:

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

    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 .

        4
  •  0
  •   Sean Patrick Floyd    14 年前

    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);
    }
    

    输出:

    我返回一个列表是因为它更可用,但是没有什么可以阻止您更改返回数组的方法或使用以下命令从外部转换结果:

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