有人已经这样做了:
http ://www.rgagnon.com/javadetails/java-0515.html
如您所见,其他保留的正则表达式字符(在正则表达式中必须转义哪些特殊字符?中
描述.^$*+?()[{\|
)也必须转义,而不仅仅是点。
逐字符解析的方法比使用String#replace(..)
方法更安全。在后一种情况下,您必须注意替换的顺序,以免替换您已经做过的事情(想象一下,如果在您的示例中您首先将 dot 替换为\\.
,然后将 windows 反斜杠替换为斜杠,会发生什么情况)。
但是,恐怕该示例不适用于所有情况。这是因为 glob 的语法因实现而异,请参阅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());
}
这不能很好地处理除*
and ?
(^w
应该转换为w
而不是在正则表达式中具有特殊含义的 '\w' ) 之外的其他字符的转义,但您可以轻松改进它。