我正在尝试从字符串中获取数字。数字仅以空格分隔。 这个代码很常见,除了我只用一个空格分隔两个数字。
Pattern pattern = Pattern.compile("(^|\\s)[0-9]+(\\s|$)");
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
numericResquest.add(Integer.parseInt(matcher.group().trim()));
}
例如:
谢谢
答案 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
}