【问题标题】:Java Simple Wildcard MatchJava 简单通配符匹配
【发布时间】:2012-10-31 11:05:40
【问题描述】:

我正在制作一个 java IRC 库,我需要一种方法来查看某个用户是否匹配可以包含通配符 * 字符的主机掩码。不使用正则表达式的最简单方法是什么?

一些例子:

    // Anything works
    *
            server.freenode.net ✔

    // Any nickname/user/host works
    *!*@*:
            any!thing@works ✔

    // Any nickname works (may have multiple nicknames on the same user)
    *!nebkat@unaffiliated/nebkat:
            nebkat!nebkat@unaffiliated/nebkat ✔
            123456!nebkat@unaffiliated/nebkat ✔
            nebkat!nebkat@unaffiliated/hacker ✘

    // Anything from an ip
    *!*@123.45.67.8:
            nebkat!nebkat@123.45.67.8 ✔
            123456!user2@123.45.67.8 ✔
            nebkat!nebkat@87.65.43.21 ✘

    // Anything where the username ends with nebkat
    *!*nebkat@*
            nebkat!nebkat@unaffiliated/nebkat ✔
            nebkat!prefix_nebkat@unaffiliated/nebkat ✔
            nebkat!nebkat_suffix@unaffiliated/nebkat ✘

【问题讨论】:

  • 为什么不使用正则表达式?这看起来是正则表达式的完美匹配。
  • @TomJohnson 我认为特殊字符可能会干扰,我必须处理它。由于它只有一个通配符,我认为没有正则表达式会更简单?
  • 你总是可以转义特殊字符...

标签: java regex wildcard


【解决方案1】:

使用 org.apache.commons.io.FilenameUtils#wildcardMatch() 方法。更多细节在回答https://stackoverflow.com/a/43394347/466677

【讨论】:

    【解决方案2】:

    这样结束了:

    public static boolean match(String host, String mask) {
        String[] sections = mask.split("\\*");
        String text = host;
        for (String section : sections) {
            int index = text.indexOf(section);
            if (index == -1) {
                return false;
            }
            text = text.substring(index + section.length());
        }
        return true;
    }
    

    【讨论】:

    • 请注意,当hostabcdef 并且maskabc 时,该函数的答案仍然是“真”。
    猜你喜欢
    • 2014-08-11
    • 2018-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多