Java 中的通配符匹配

2022-09-03 16:35:51

我正在编写一个简单的调试程序,该程序将可以包含星号的简单字符串作为输入,以指示通配符匹配 - 任何

*.wav  // matches <anything>.wav
(*, a) // matches (<anything>, a)

我以为我会简单地采用该模式,转义其中的任何正则表达式特殊字符,然后将任何字符替换回。然后使用正则表达式匹配器。\\*.*

但是我找不到任何Java函数来转义正则表达式。我能找到的最好的匹配是 ,然而它只是把 和 放在字符串的开头和结尾。Pattern.quote\Q\E

Java中有什么东西可以让你简单地进行通配符匹配,而不必从头开始实现算法?


答案 1

Apache Commons-IO库中有一个小的实用程序方法:org.apache.commons.io.FilenameUtils#wildcardMatch(),你可以使用它而不涉及正则表达式的复杂性。

API文档可以在以下位置找到:https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FilenameUtils.html#wildcardMatch(java.lang.String,%20java.lang.String)


答案 2

只是逃避一切 - 它不会造成伤害。

    String input = "*.wav";
    String regex = ("\\Q" + input + "\\E").replace("*", "\\E.*\\Q");
    System.out.println(regex); // \Q\E.*\Q.wav\E
    System.out.println("abcd.wav".matches(regex)); // true

或者,您可以使用字符类:

    String input = "*.wav";
    String regex = input.replaceAll(".", "[$0]").replace("[*]", ".*");
    System.out.println(regex); // .*[.][w][a][v]
    System.out.println("abcd.wav".matches(regex)); // true

通过将字符放在字符类中来“转义”字符更容易,因为几乎所有字符在字符类中都失去了任何特殊意义。除非您期望出现奇怪的文件名,否则这将起作用。