类似IP地址的字符串提取算法? [爪哇]

时间:2015-09-07 20:47:17

标签: java algorithm

给出如下字符串:

  

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 通过

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

2 个答案:

答案 0 :(得分:2)

以下是使用正则表达式的方法:

    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

答案 1 :(得分:1)

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

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是很好的做法。

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

    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();
    }