Java 正则表达式匹配“;路径/*.extension";

Java 正则表达式匹配“;路径/*.extension";,java,regex,Java,Regex,我正在尝试找到一个符合以下格式的正则表达式: 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]; 如果最

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

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/
,不包含文件名和扩展名,则令牌[1]和令牌[2]将为空。 在下列情况下:
usr/*.pdf
那么令牌[1]将只包含字符串
“*”

非常感谢您的帮助。

此代码应为:

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

我假设您正在使用Java。这应该起作用:


Pattern.compile(“路径/(.*?(:\\(文件扩展名))?”

如果您可以使用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("------------");
}
String data=“temp/*.jpg,usr/*.pdf,var/lib/*.so,tmp/*,usr/*,usr/*.*”;
模式p=模式
.compile((?(\\w+/)+)((?\\w++.[*])?([.](?\\w++.[*]))?”;
匹配器m=p.Matcher(数据);
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(“-------------”);
}

在另一种方法中,简单使用'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);

请注意:您需要处理其他情况,例如没有扩展名的文件路径。

为什么要使用正则表达式? 我个人觉得
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); 
}
字符串路径;
字符串文件名;
@可为空的字符串扩展;
//寻找最后一条斜线
int lastSlash=fullPath.lastIndexOf('/');
//查找最后一条斜线后的最后一个点
int lastDot=fullPath.lastIndexOf('.',lastsslash+1);
if(lastDot<0){
filename=fullPath.substring(lastSlash+1);
//如果没有点,那么就没有扩展
//与“foo/bar”中的空扩展名不同
扩展=空;
}否则{
filename=fullPath.substring(lastsslash+1,lastDot);
扩展名=fullPath.substring(lastDot+1);
}

你能告诉我们你试过什么吗?像
usr/*
usr/*.
这样的输入可能吗?@Pshemo,当然可以。谢谢大家的贡献!非常感谢!可能通过标志
模式。DOT\u ALL
。在大多数主要操作系统中,文件名中都允许使用换行符,因此没有理由将文件名与非换行符空格匹配,而是无法将文件名与换行符匹配。
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); 
}