正则表达式匹配“路径/ *。扩展名”

时间:2013-08-15 18:46:40

标签: java regex

我正在尝试找到一个符合以下格式的正则表达式:

path/*.file_extension

例如:

temp/*.jpg
usr/*.pdf
var/lib/myLib.so
tmp/

使用正则表达式,我想将匹配的部分存储到String数组中,例如:

String[] tokens;
// regex magic here
String path = tokens[0];
String filename = tokens[1];
String extension = tokens[2];

如果是最后一个案例tmp/,它不包含文件名和扩展名,则token [1]和token [2]将为null。 在以下情况下:     usr/*.pdf 然后令牌[1]只包含字符串"*"

非常感谢你的帮助。

5 个答案:

答案 0 :(得分:2)

如果您可以使用Java7,那么您可以使用像这样的命名组

String data = "temp/*.jpg, usr/*.pdf, var/lib/*.so, tmp/*, usr/*, usr/*.*";

Pattern p = Pattern
        .compile("(?<path>(\\w+/)+)((?<name>\\w+|[*]))?([.](?<extension>\\w+|[*]))?");

Matcher m = p.matcher(data);
while (m.find()) {
    System.out.println("data=" + m.group());
    System.out.println("path=" + m.group("path"));
    System.out.println("name=" + m.group("name"));
    System.out.println("extension=" + m.group("extension"));
    System.out.println("------------");
}

答案 1 :(得分:0)

此代码应该是wotk:

String line = "var/lib/myLib.so";
Pattern p = Pattern.compile("(.+?(?=/[^/]*$))/([^.]+)\\.(.+)$");
Matcher m = p.matcher(line);
List<String> tokens = new ArrayList<String>();
if (m.find()) {
    for (int i=1; i <= m.groupCount(); i++) {
        tokens.add(m.group(i));
    }
}
System.out.println("Tokens => " + tokens);

<强>输出:

Tokens => [var/lib, myLib, so]

答案 2 :(得分:0)

我假设你正在使用Java。这应该有效:

Pattern.compile("path/(.*?)(?:\\.(file_extension))?");

答案 3 :(得分:0)

在另一种方法中,'substring()/ lastIndexOf()'方法的简单用法应该用于此目的:

    String filePath = "var/lib/myLib.so";
    String fileName = filePath.substring(filePath.lastIndexOf('/')+1);
    String path = filePath.substring(0, filePath.lastIndexOf('/'));
    String fileName = fileName.substring(0, fileName.lastIndexOf('.'));
    String extension = fileName.substring(fileName.lastIndexOf('.')+1);

请注意:您需要处理备用方案,例如没有扩展名的文件路径。

答案 4 :(得分:0)

为什么要使用正则表达式? 我个人认为lastIndexOf更具可读性。

String path;
String filename;
@Nullable String extension;

// Look for the last slash
int lastSlash = fullPath.lastIndexOf('/');
// Look for the last dot after the last slash
int lastDot = fullPath.lastIndexOf('.', lastSlash + 1);
if (lastDot < 0) {
  filename = fullPath.substring(lastSlash + 1);
  // If there is no dot, then there is no extension which
  // is distinct from the empty extension in "foo/bar."
  extension = null;
} else {
  filename = fullPath.substring(lastSlash + 1, lastDot);
  extension = fullPath.substring(lastDot + 1); 
}