【问题标题】:Algorithm for IP Address-like String extraction? [Java]用于类似 IP 地址的字符串提取的算法? [爪哇]
【发布时间】:2015-09-08 09:37:54
【问题描述】:

给定一个字符串,如:

S5.4.2

3.2

SD45.G.94L5456.294.1004.8888.0.23QWZZZZ

5.44444444444444444444444444444.5GXV

您需要返回:

5.4.2

3.2

5456.294.1004.8888.0.23

5.44444444444444444444444444444.5

有没有一种聪明的方法来编写一个只提取类似 IP 地址的数字的方法? (我说类似 IP 地址是因为我不确定 IP 地址是否通常是一组数字)。我的一位朋友建议我正在寻找的可能有一个正则表达式,所以我找到了this。该解决方案的问题是我认为它总共仅限于 4 个整数,并且也不会期望像点之间有 4 个以上数字这样的整数。

我需要它来识别模式:

NUMS DOT(只有一个)NUMS DOT(只有一个)NUMS

意思:

234..54.89 失败

.54.6.10 失败

256 失败

234.7885.924.120.2.0.4 通过

有什么想法吗?感谢大家。我已经在这个问题上待了几个小时,但无法弄清楚。

【问题讨论】:

  • IP 地址只有 4 个数字。您将永远不会看到无效的有效 IP。无论如何,您推荐正则表达式的朋友是正确的。这将是根据您的规范匹配字符串的最简单方法。你希望它只匹配 IP(所以 4 个数字)还是其他的?
  • @Piccolo IPv6 地址是 组十六进制数字。
  • @Piccolo 我需要从字符串中提取的数字必须以整数开头,以点分隔整数,必须以整数结尾,并且可以无限长(或者只要字符串可以容纳值,所以 240 万左右)。抱歉,如果我的帖子中没有明确说明。
  • @ceejayoz 哦,对了,我总是忘记 IPv6。
  • 这是一个可以用来匹配它们的正则表达式:^\d(\.\d+)+$,这是我的测试用例:fiddle.re/q76j86 编辑:只需重新阅读问题,这不正是您正在寻找的为,但希望它能让你走上正轨。

标签: java algorithm


【解决方案1】:

这是一种使用正则表达式的方法:

    private static String getNumbers(String toTest){
        String IPADDRESS_PATTERN =
                "(\\d+\\.)+\\d+";

        Pattern pattern = Pattern.compile(IPADDRESS_PATTERN);
        Matcher matcher = pattern.matcher(toTest);
        if (matcher.find()) {
            return matcher.group();
        }
        else{
            return "did not match anything..";
        }
    }

这将匹配 number-dot-number-... 模式与无限数量的数字。

我稍微修改了this Answer

【讨论】:

  • 这太不可思议了。这是如何运作的?我才第二年,所以我还没有学习正则表达式的模式或匹配器。所以在模式中......你做了\\d,并且\告诉编译器一个特殊字符即将到来。那么 \d 是什么意思呢?它必须是一个数字,对吧?然后\。表示句点,最后在模式的末尾必须有一个 \d(数字)。但是它怎么知道,如果像 5.4.3 一样给出,不返回 5.4 当它读取 5.4 时,它现在具有它正在寻找的 #.# 模式。是什么告诉它继续寻找更多?非常感谢。
  • 那么正则表达式模式实际上是(\d+\.)+\d+,其中\d 表示从0 到9 的任何数字。+ 表示至少需要一个数字。转义的\. 意味着每个数字后面都需要一个点。这整件事(\d+\.)+ 意味着这些大括号中的所有内容都需要至少出现一次。最后,\d+ 意味着最后也需要一个数字。您可以复制正则表达式并对其进行测试here,您还会看到更详细的说明。
【解决方案2】:

有很多方法可以做到这一点。这是最好的方法,我猜。

public static String NonDigits(final CharSequence input)
{
final StringBuilder sb = new StringBuilder(input.length());
for(int i = 0; i < input.length(); i++){
    final char c = input.charAt(i);
    if(c > 47 && c < 58){
        sb.append(c);
    }
}
return sb.toString();
}

CharSequence 是可读的字符序列。这个界面 提供对许多不同类型的统一的只读访问 字符序列。

  1. 看看这个ASCII Table。从 47 到 58 的 ascii 值是 0 到 9。因此,这是提取数字的最佳方法。

  2. "final"关键字更像是设置一次,不能修改。将字符串声明为 final 是一种很好的做法。

相同的代码,只是为了更好地理解代码:

public static String NonDigits(String input)
{
    StringBuilder sb = new StringBuilder(input.length());

    for(int i = 0; i < input.length(); i++)
    {
        char c = input.charAt(i);
        if(c > 47 && c < 58)
        {
            sb.append(c);
        }
}
return sb.toString();
}

【讨论】:

  • @Shiva_Shinde 哇...如果嵌套循环和 if 语句,我无法在 250 行中写出一些东西,你写了 20 行。你能解释一下吗?为什么要使用最终的 CharSequence 而不是 String?您是否是 final 变量,只是为了避免意外更改它们? if (c > 47 && c
  • 我已经更新了答案。抱歉没有说清楚,我不知道你在第二年。伟大的倡议。继续编码:)
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多