Java:将文件模式转换为正则表达式模式
Java: Converting File Pattern to Regular Expression Pattern
我正在尝试创建一个将文件模式转换为 java 正则表达式模式的实用函数,我需要它来对目录内的文件进行通配符匹配。我提出了 4 个需要考虑的案例。案例够不够?
regexPattern = filePattern;
// convert windows backslash to slash
regexPattern = regexPattern.replace("\", "/");
// convert dot to \.
regexPattern = regexPattern.replace("\.", "\\.z");
// convert ? wildcard to .+
regexPattern = regexPattern.replace("?", ".+");
// convert * wildcard to .*
regexPattern = regexPattern.replace("*", ".*");
有人已经这样做了:
http://www.rgagnon.com/javadetails/java-0515.html
如您所见,其他保留的正则表达式字符(在 What special characters must be escaped in regular expressions? 中有描述
即 .^$*+?()[{\|
) 也必须转义,而不仅仅是点。
逐个字符解析的方法比使用String#replace(..)
方法更安全。在后一种情况下,你必须注意替换的顺序,这样你就不会替换你已经做过的东西(想象一下如果在你的例子中你首先用 \.
替换点然后 windows 反斜杠到斜杠)。
但是,恐怕这个例子并不适用于所有情况。这是因为 globs 的语法在不同的实现中是不同的,参见 wikipedia entry.
对于简单的 windows cmd 模式,代码为:
public static String wildcardToRegex(String wildcard){
StringBuffer s = new StringBuffer(wildcard.length());
s.append('^');
for (int i = 0, is = wildcard.length(); i < is; i++) {
char c = wildcard.charAt(i);
switch(c) {
case '*':
s.append(".*");
break;
case '?':
s.append(".");
break;
case '^': // escape character in cmd.exe
s.append("\");
break;
// escape special regexp-characters
case '(': case ')': case '[': case ']': case '$':
case '.': case '{': case '}': case '|':
case '\':
s.append("\");
s.append(c);
break;
default:
s.append(c);
break;
}
}
s.append('$');
return(s.toString());
}
这不能很好地处理除 *
和 ?
以外的其他字符的转义(^w
应转换为 w
而不是 '\w` 具有特殊的在正则表达式中的意思),但你可以很容易地改进它。
FileSystem.getPathMatcher(String)
supports glob syntax.
PathMatcher matcher =
FileSystems.getDefault().getPathMatcher("glob:*.{java,class}");
Path filename = ...;
if (matcher.matches(filename)) {
System.out.println(filename);
}
我正在尝试创建一个将文件模式转换为 java 正则表达式模式的实用函数,我需要它来对目录内的文件进行通配符匹配。我提出了 4 个需要考虑的案例。案例够不够?
regexPattern = filePattern;
// convert windows backslash to slash
regexPattern = regexPattern.replace("\", "/");
// convert dot to \.
regexPattern = regexPattern.replace("\.", "\\.z");
// convert ? wildcard to .+
regexPattern = regexPattern.replace("?", ".+");
// convert * wildcard to .*
regexPattern = regexPattern.replace("*", ".*");
有人已经这样做了: http://www.rgagnon.com/javadetails/java-0515.html
如您所见,其他保留的正则表达式字符(在 What special characters must be escaped in regular expressions? 中有描述
即 .^$*+?()[{\|
) 也必须转义,而不仅仅是点。
逐个字符解析的方法比使用String#replace(..)
方法更安全。在后一种情况下,你必须注意替换的顺序,这样你就不会替换你已经做过的东西(想象一下如果在你的例子中你首先用 \.
替换点然后 windows 反斜杠到斜杠)。
但是,恐怕这个例子并不适用于所有情况。这是因为 globs 的语法在不同的实现中是不同的,参见 wikipedia entry.
对于简单的 windows cmd 模式,代码为:
public static String wildcardToRegex(String wildcard){
StringBuffer s = new StringBuffer(wildcard.length());
s.append('^');
for (int i = 0, is = wildcard.length(); i < is; i++) {
char c = wildcard.charAt(i);
switch(c) {
case '*':
s.append(".*");
break;
case '?':
s.append(".");
break;
case '^': // escape character in cmd.exe
s.append("\");
break;
// escape special regexp-characters
case '(': case ')': case '[': case ']': case '$':
case '.': case '{': case '}': case '|':
case '\':
s.append("\");
s.append(c);
break;
default:
s.append(c);
break;
}
}
s.append('$');
return(s.toString());
}
这不能很好地处理除 *
和 ?
以外的其他字符的转义(^w
应转换为 w
而不是 '\w` 具有特殊的在正则表达式中的意思),但你可以很容易地改进它。
FileSystem.getPathMatcher(String)
supports glob syntax.
PathMatcher matcher =
FileSystems.getDefault().getPathMatcher("glob:*.{java,class}");
Path filename = ...;
if (matcher.matches(filename)) {
System.out.println(filename);
}