使用正则表达式获取字符串中的数字

时间:2013-12-04 15:35:25

标签: java regex numbers space

我正在尝试从字符串中获取数字。数字仅以空格分隔。 这个代码很常见,除了我只用一个空格分隔两个数字。

Pattern pattern = Pattern.compile("(^|\\s)[0-9]+(\\s|$)");
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
    numericResquest.add(Integer.parseInt(matcher.group().trim()));
}

例如:

  • 确定:11 rre 12
  • 确定:11 12 (数字之间有两个空格)
  • 找不到11 测试12 11 rre (数字之间只有一个空格)

谢谢

4 个答案:

答案 0 :(得分:0)

为什么不将正则表达式中的数字与外观相匹配:

Pattern pattern = Pattern.compile("(?<=\\s)[0-9]+(?=\\s+|$)");
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
    numericResquest.add(Integer.parseInt(matcher.group()));
}

答案 1 :(得分:0)

String[] numbers = value.split(" ");
for(String number : numbers) {
    numericRequest.add(Integer.parseInt(number));
}

如果您获得NumberFormatException,则输入格式不正确。

答案 2 :(得分:0)

问题在于,不计算字符串开头或结尾的情况,您的模式需要之前的之后的空格。因此,如果您的字符串为"11 12",则第一个匹配将找到"11 ",最后会有一个空格。匹配器的索引将指向模式之后,即"12"。但由于模式在开始时也需要一个空格,下一次匹配尝试将不起作用,因为"12"的开头没有空格。

使用相同方法解决此问题的一种方法:使用matcher.lookingAt代替matcher.find;只有当前索引处有一个模式时,lookingAt才会匹配。然后你可以修复你的模式,这样就不必在开头就有空格了。

Pattern pattern = Pattern.compile("\\s*[0-9]+(\\s|$)");
Matcher matcher = pattern.matcher(value);
while (matcher.lookingAt()) {
    numericResquest.add(Integer.parseInt(matcher.group().trim()));
}

在数字出现之前,这允许但不要求当前索引处的任意数量的空格。

(注意:我没有测试过这个。)

答案 3 :(得分:0)

正则表达式

(^|(?<=\s))(\d+)(?=\s|$)

迭代所有匹配并捕获字符串中的组

try {
    Pattern regex = Pattern.compile("(^|(?<=\\s))(\\d+)(?=\\s|$)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
    Matcher regexMatcher = regex.matcher(subjectString);
    while (regexMatcher.find()) {
        for (int i = 1; i <= regexMatcher.groupCount(); i++) {
            // matched text: regexMatcher.group(i)
            // match start: regexMatcher.start(i)
            // match end: regexMatcher.end(i)
        }
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}