正则表达式 - 匹配模式与值列表

时间:2014-01-23 12:03:21

标签: java regex

我有一个像google.com这样的输入和一个像

这样的值列表
 1. *.com
 2. *go*.com
 3. *abc.com
 4. *le.com
 5. *.*

我需要在java中编写一个模式,它应该返回除*abc.com之外的所有匹配项。我尝试了一些,但没有按预期工作。请帮助。提前谢谢。

更新

public static void main(String[] args) {
        List<String> values = new ArrayList<String>();
        values.add("*.com");
        values.add("*go*.com");
        values.add("*abc.com");
        values.add("*le.com");
        values.add("*.*");
        String stringToMatch = "google.com";
        for (String pattern : values) {
            String regex = Pattern.quote(pattern).replace("*", ".*");
            System.out.println(stringToMatch.matches(regex));
        }
    }

输出:

false
false
false
false
false

我试过这个,但模式不匹配。

4 个答案:

答案 0 :(得分:2)

您可以将给定的模式转换为正则表达式,然后使用正常的正则表达式函数,如String.matches():

for (String pattern : patterns) {
    final String regex = pattern.replaceAll("[\\.\\[\\](){}?+|\\\\]", "\\\\$0").replace("*", ".*");
    System.out.println(stringToMatch.matches(regex));
}

编辑:显然Pattern.quote()只是在字符串周围添加\Q...\E。编辑使用手动报价。

编辑2:另一种可能性是:

final String regex = Pattern.quote(pattern).replace("*", "\\E.*\\Q");

答案 1 :(得分:2)

基于previous answer of mine(阅读问题的评论,非常有启发性),这里是一个通配符ToRegex方法:

public static String wildcardsToRegex(String wildcards) {

    String regex = wildcards;

    // .matches() auto-anchors, so add [*] (i.e. "containing")
    regex = "*" + regex + "*";
    // replace any pair of backslashes by [*]
    regex = regex.replaceAll("(?<!\\\\)(\\\\\\\\)+(?!\\\\)", "*");
    // minimize unescaped redundant wildcards
    regex = regex.replaceAll("(?<!\\\\)[?]*[*][*?]+", "*");
    // escape unescaped regexps special chars, but [\], [?] and [*]
    regex = regex.replaceAll("(?<!\\\\)([|\\[\\]{}(),.^$+-])", "\\\\$1");
    // replace unescaped [?] by [.]
    regex = regex.replaceAll("(?<!\\\\)[?]", ".");
    // replace unescaped [*] by [.*]
    regex = regex.replaceAll("(?<!\\\\)[*]", ".*");
    // return whether data matches regex or not

    return regex;

}

然后,在你的循环中,使用:

for (String pattern : values) {
    System.out.println(stringToMatch.matches(wildcardsToRegex(pattern)));
}

答案 2 :(得分:1)

在代码中更改此行:

String regex = Pattern.quote(pattern).replace("*", ".*");

对此:

String regex = pattern.replace(".", "\\.").replace("*", ".*");

答案 3 :(得分:0)

您可以使用:

            List<String> values = new ArrayList<String>();
            values.add("*.com");
            values.add("*go*.com");
            values.add("*abc.com");
            values.add("*le.com");
            values.add("*.*");
            String stringToMatch = "google.com";
            for (String pattern : values) {
                String regex = pattern.replaceAll("[.]", "\\.").replaceAll("[*]", "\\.\\*");
                System.out.println(stringToMatch.matches(regex));
            }