Java String.matches 正则表达式

标签 java regex

我试图查看给定的主机名是否以逗号分隔字符串的形式出现在主机列表中,如下所示:

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 种情况会更快 - 列表开头、中间和结尾的匹配,这可以分别使用 startsWithcontainsendsWith 方法来完成。这是第二个选项,对于您的情况我更喜欢:

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/

相关文章:

java - 如何使用 NGAC 实现 ABAC 访问控制

r - 提取 ( ) 和 % 符号之前的所有值

php - 如何从字符串中提取数字并将其添加到数组?

java - primefaces 命令按钮操作不适用于级联下拉菜单

java - 帮助将 Drawed Layout 转换为 MigLayout

java - 如何从ArrayList<>中获取数组

python - 在 python 中使用正则表达式拆分字符串

java - 部署后 Google App Engine 返回 HTTP 响应代码 403

python - 在 python pandas 中返回字符串中正则表达式的多个匹配项

Javascript 从多行字符串中删除前导和尾随空格,并用逗号替换其余的空白 block