0

我在一个Pattern对象中保存文件名格式数据。例如:_\\d+x\\d+\\.png。在我的设置中,这将表示不同大小的图标(例如icon_16x16.pngicon_48x48.png等等)。

我有一种将实际文件名与给定模式进行比较的方法;但是,还必须提供基本名称(在我的示例中,这将是“图标”):

public boolean matches(String filename, String baseName) {
    if (!IOCase.SYSTEM.checkStartsWith(filename, baseName)) {
        return false;
    }

    return format.matcher(filename.replaceFirst(baseName, "")).matches();
}

我在这里做的是首先检查是否filename以基本名称开头。如果是这样,则从文件名字符串中删除基本名称,以便可以将其与Pattern对象 ( format) 进行比较。

我知道我可以做到return filename.matches(Pattern.quote(baseName) + format.pattern()),但我想知道是否有更好的、希望更程序化的方式来做到这一点。

准确地说,我想知道是否可以在 java.util.regex.Pattern 不处理它们的底层字符串表示的情况下添加或合并其中两个。

4

2 回答 2

1

不,您不能修改已编译的Pattern. Pattern您可以通过组合正则表达式字符串并Pattern.compile()再次调用来创建一个新的。

于 2012-11-06T18:23:42.173 回答
1

在下面找到使用模式/匹配器/组的示例代码,无需任何字符串操作:

如果前缀只是单词字符

    Pattern p = Pattern.compile("(\\w+)(_\\d+x\\d+\\.png)");
    Matcher m = p.matcher("icon1_16x16.png");
    String baseName = "icon";
            //If match found, m.group(1) returns the prefix of `_..x..png`
    if(m.find() && baseName.equals(m.group(1))){
         System.out.println("Match Found");
    }else{
       System.out.println("Match Not Found");
    }

如果前缀可以是任何字符,则使用正则表达式作为(.+)(_\\d+x\\d+\\.png)

于 2012-11-06T18:42:09.747 回答