我试图查看给定的主机名是否以逗号分隔字符串的形式出现在主机列表中,如下所示:
String list = "aa.com,bb.com,cc.com,dd.net,ee.com,ff.net";
String host1 = "aa.com"; // should be a match
String host2 = "a.com"; // shouldn't be a match
String host3 = "ff.net" // should be a match
// here is a test for host1
if (list.matches(".*[,^]" + host1 + "[$,].*")) {
System.out.println(host1 + " matched");
}
else {
System.out.println(host1 + " not matched");
}
但是我没有匹配到主机(aa.com),但我对正则表达式不是很熟悉。请纠正我!
顺便说一句,我不想使用将主机列表拆分为数组然后在那里进行匹配的解决方案。它太慢了,因为主机列表可能很长。正则表达式方法可能更糟糕,但我试图首先让它发挥作用。
最佳答案
我还认为,如果您正在寻找精确匹配,则正则表达式太慢,因此我尝试编写一种方法来查找列表中主机名的出现情况,并检查每个子字符串是否不是更广泛主机名的一部分(例如“a.com”是“aa.com”的一部分)。如果不是 - 结果为 true,则列表中存在这样的主机。代码如下:
boolean containsHost(String list, String host) {
boolean result = false;
int i = -1;
while((i = list.indexOf(host, i + 1)) >= 0) { // while there is next match
if ((i == 0 || list.charAt(i - 1) == ',') // beginning of the list or has a comma right before it
&& (i == (list.length() - host.length()) // end of the list
|| list.charAt(i + host.length()) == ',')) { // or has a comma right after it
result = true;
break;
}
}
return result;
}
但后来我认为只检查 3 种情况会更快 - 列表开头、中间和结尾的匹配,这可以分别使用 startsWith
、contains
和 endsWith
方法来完成。这是第二个选项,对于您的情况我更喜欢:
boolean containsHostShort(String list, String host) {
return list.contains("," + host + ",") || list.startsWith(host + ",") || list.endsWith("," + host);
}
UPD:ZouZou 对您的帖子的评论似乎也不错,我建议您比较与实际情况下的尺寸相似的列表上的速度,然后选择最快的一个。
关于Java String.matches 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23875793/