簡體   English   中英

使用正則表達式獲取字符串中的數字

[英]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()));
}

例如:

  • OK :11 RRE 12
  • OK :11 12 (數字之間有兩個空格)
  • 找不到11測試12 11 RRE (數字之間只有一個空格)

謝謝

為什么不只將正則表達式中的數字與環顧四周相匹配:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM