【问题标题】:Adding onto a java.util.regex.Pattern or Merging Them添加到 java.util.regex.Pattern 或合并它们
【发布时间】:2012-11-06 18:15:18
【问题描述】:

我将文件名格式数据保存在 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 或合并其中两个而不处理它们的底层字符串表示。 p>

【问题讨论】:

  • 您的方法是 100% 程序化的。你有什么问题?
  • 您已经有 2 种程序化方式。
  • 抱歉,我忘了包括问题中最重要的部分。已编辑。

标签: java regex string pattern-matching filenames


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    如果前缀只是单词字符

        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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多