对于“glob”,是否存在等效的java.util.regex?类型模式? [英] Is there an equivalent of java.util.regex for "glob" type patterns?
问题描述
是否有用于在Java中执行glob类型匹配的标准(最好是Apache Commons或类似的非病毒)库?当我不得不在Perl中执行类似操作时,我只是将所有。
更改为 \。
, *
到。*
和?
to。
等等,但我想知道是否有人为我做过这项工作。
Is there a standard (preferably Apache Commons or similarly non-viral) library for doing "glob" type matches in Java? When I had to do similar in Perl once, I just changed all the ".
" to "\.
", the "*
" to ".*
" and the "?
" to ".
" and that sort of thing, but I'm wondering if somebody has done the work for me.
类似的问题:从glob表达式创建正则表达式
推荐答案
没有任何内置功能,但将类似glob的内容转换为正则表达式非常简单:
There's nothing built-in, but it's pretty simple to convert something glob-like to a regex:
public static String createRegexFromGlob(String glob)
{
String out = "^";
for(int i = 0; i < glob.length(); ++i)
{
final char c = glob.charAt(i);
switch(c)
{
case '*': out += ".*"; break;
case '?': out += '.'; break;
case '.': out += "\\."; break;
case '\\': out += "\\\\"; break;
default: out += c;
}
}
out += '$';
return out;
}
这对我有用,但我不确定它是否涵盖了全局标准,如果有一个:)
this works for me, but I'm not sure if it covers the glob "standard", if there is one :)
Paul Tomblin的更新:我找到了一个执行全局转换的perl程序,并将其调整为Java我最终得到:
Update by Paul Tomblin: I found a perl program that does glob conversion, and adapting it to Java I end up with:
private String convertGlobToRegEx(String line)
{
LOG.info("got line [" + line + "]");
line = line.trim();
int strLen = line.length();
StringBuilder sb = new StringBuilder(strLen);
// Remove beginning and ending * globs because they're useless
if (line.startsWith("*"))
{
line = line.substring(1);
strLen--;
}
if (line.endsWith("*"))
{
line = line.substring(0, strLen-1);
strLen--;
}
boolean escaping = false;
int inCurlies = 0;
for (char currentChar : line.toCharArray())
{
switch (currentChar)
{
case '*':
if (escaping)
sb.append("\\*");
else
sb.append(".*");
escaping = false;
break;
case '?':
if (escaping)
sb.append("\\?");
else
sb.append('.');
escaping = false;
break;
case '.':
case '(':
case ')':
case '+':
case '|':
case '^':
case '$':
case '@':
case '%':
sb.append('\\');
sb.append(currentChar);
escaping = false;
break;
case '\\':
if (escaping)
{
sb.append("\\\\");
escaping = false;
}
else
escaping = true;
break;
case '{':
if (escaping)
{
sb.append("\\{");
}
else
{
sb.append('(');
inCurlies++;
}
escaping = false;
break;
case '}':
if (inCurlies > 0 && !escaping)
{
sb.append(')');
inCurlies--;
}
else if (escaping)
sb.append("\\}");
else
sb.append("}");
escaping = false;
break;
case ',':
if (inCurlies > 0 && !escaping)
{
sb.append('|');
}
else if (escaping)
sb.append("\\,");
else
sb.append(",");
break;
default:
escaping = false;
sb.append(currentChar);
}
}
return sb.toString();
}
我正在编辑这个答案而不是自己制作,因为这个答案已经放了我走在正确的轨道上。
I'm editing into this answer rather than making my own because this answer put me on the right track.
这篇关于对于“glob”,是否存在等效的java.util.regex?类型模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!