1

我有一个由 IP 地址串联形成的字符串,例如:

"127.272.1.43;27.27.1.43;127.127.27.67;128.27.1.43;127.20.1.43;111.27.1.43;127.27.1.43;"

当给定一个新的 IP 地址时,我需要检查 IP 的前半部分是否是 IP 地址字符串的一部分。例如,如果"127.27.123.23"给出,我需要查找字符串中是否有任何 IP 地址以"127.27"

我有以下代码,其中userIP="127.27."

int i = StringUtils.indexOf(dbIPString, userIP);
do {
    if (i > 0) {
        char ch = dbIPString.charAt(i - 1);
        if (ch == ';') {
            System.out.println("IP is present in db");
            break;

        } else {
            i = StringUtils.indexOf(dbIPString, userIP, i);
        }
    } else if (i == 0) {
        System.out.println("IP is present in db");
        break;
    } else {

        System.out.println("IP is not present in db");
    }
} while (i >= 0);

能不能更有效率?或者我可以使用正则表达式吗?哪个效率更高?

4

2 回答 2

1

纯字符串匹配通常比正则表达式匹配更快。我会保持简单并做这样的事情:

if (StringUtils.startsWith(dbIPString, userIP)) {
    ... // prefix is present
} else if (StringUtils.indexOf(dbIPString, ";" + userIP) > 0) {
    ... // prefix is present
} else {
    ... // prefix is not present
}

如果您可以安排列表始终以“;”开头 那么搜索第一个条目将不再是特殊情况,并且可以简化逻辑。

如果列表很大并且您将进行大量此类搜索并且速度确实很重要,那么也许您可以在构建地址列表时将每个前缀添加到某种哈希或树中。这些数据结构中的查找应该比字符串匹配更快。

于 2012-04-17T05:51:15.727 回答
0

假设您只关心整个 IP 地址匹配,并假设您在查找时不想127.255.1.43匹配127.25,那么

(?<=^|;)127\.25\.\d+\.\d+

将是一个合适的正则表达式。

在 Java 中:

Pattern regex = Pattern.compile(
    "(?<=^|;)       # Assert position at the start of the string or after ;\n" +
    Pattern.quote(userIP) +
    "\\.\\d+\\.\\d+ # Match .nnn.nnn", 
    Pattern.COMMENTS);
于 2012-04-17T07:52:29.350 回答