我正在尝试找到一个符合以下格式的正则表达式:
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]只包含字符串"*"
。
非常感谢你的帮助。
答案 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);
}