给出如下字符串:
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 通过
有什么想法吗?感谢大家。我已经在这里待了几个小时,无法弄清楚这一点。
答案 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是一个可读的字符序列。这个界面 提供对许多不同类型的统一,只读访问 字符序列。
看看这个ASCII Table。从47到58的ascii值是0到9.因此,这是提取数字的最佳方式,而不是任何其他方式。
"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();
}