更清洁的方法来解析这个String?

时间:2017-05-19 16:36:31

标签: java

我希望格式为'%s_%d.y'的字符串。例如,“aabsa_124.y”或“x_5.y”。

我正在使用以下代码提取字符串的数字部分,是否有任何建议可以更清晰地提取数字?

String suffix = input.split("_")[1];
String numeric = suffix.split("\\.")[0];
int number = Integer.parseInt(numeric)

4 个答案:

答案 0 :(得分:1)

您还可以使用RegExp更好地捕获您要查找的号码。这里的regExp使用正向前瞻(?=)和后瞻(?< =)。如果您不想要前瞻/后观逻辑,也可以使用简单组。

String input = "aabsa_124.y";
Pattern p = Pattern.compile("(?<=\\_)\\d+(?=\\.\\w+)");
Matcher m = p.matcher(input);
if (m.find()) {
    int number = Integer.parseInt(m.group());
    System.out.println(number);//124
}

这也会匹配“str_str_2.y”之类的字符串。

答案 1 :(得分:0)

这样的事情可能是:

        String s = "aabsa_124.y";
        int number = Integer.parseInt(s.replaceAll("[^\\d]", ""));

答案 2 :(得分:0)

你可以将所有非degit替换为空,然后你可以解析你的int:

int number = Integer.parseInt(input.replaceAll( "[^\\d]", ""));

如果您的String包含许多整数,并且您想要提取此整数,则可以使用模式,例如:

String input = "aabsa_124_155.y";
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(input);

while (m.find()) {
    System.out.println(m.group());
}

<强>输出

124
155

答案 3 :(得分:0)

重要的是使用良好的名称和单元测试在自己的方法中抽象解析逻辑。这将使你的代码干净。

就个人而言,我会使用正则表达式。

您的实现适用于您描述的输入,但它不适用于“str_str_2.y”或“str_2.34.y”等示例。

在使用一些棘手的内衬之前记住这一点:

  

任何傻瓜都可以编写计算机可以理解的代码。好   程序员编写人类可以理解的代码。

     

Martin Fowler,2008年。