[英]Get number in string with a regexp
我正在嘗試從字符串中獲取數字。 數字僅以空格分隔。 這段代碼在很多情況下都有效,除了我只用一個空格分隔了兩個數字。
Pattern pattern = Pattern.compile("(^|\\s)[0-9]+(\\s|$)");
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
numericResquest.add(Integer.parseInt(matcher.group().trim()));
}
例如:
謝謝
為什么不只將正則表達式中的數字與環顧四周相匹配:
Pattern pattern = Pattern.compile("(?<=\\s)[0-9]+(?=\\s+|$)");
Matcher matcher = pattern.matcher(value);
while (matcher.find()) {
numericResquest.add(Integer.parseInt(matcher.group()));
}
String[] numbers = value.split(" ");
for(String number : numbers) {
numericRequest.add(Integer.parseInt(number));
}
如果收到NumberFormatException
,則輸入的格式不正確。
問題是,在開始或結束的字符串不計的情況下,你的模式之前和號碼后 ,需要一個空間。 因此,如果您的字符串是"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()));
}
這樣,在出現數字之前,當前索引可以允許但不要求任何數量的空格。
(注意:我尚未對此進行測試。)
(^|(?<=\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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.