1

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

path/*.file_extension

例如:

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

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

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

在最后一种情况下tmp/,不包含文件名和扩展名,则 token[1] 和 token[2] 将为空。如果是: usr/*.pdf ,则 token[1] 将仅包含 string "*"

非常感谢您的帮助。

4

5 回答 5

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("------------");
}
于 2013-08-15T19:00:20.413 回答
0

我假设您使用的是 Java。这应该有效:

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

于 2013-08-15T18:59:22.517 回答
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); 
}
于 2013-08-15T19:05:46.497 回答
0

这段代码应该可以:

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]
于 2013-08-15T18:57:38.370 回答
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);

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

于 2013-08-15T19:01:51.040 回答