我有一个像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
我试过这个,但模式不匹配。
答案 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));
}