如何从 Java 中的字符串中提取 7 个数字的序列?

How to extract a sequence of 7 numbers from a String in Java?

假设我有一些包含 "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours"String 对象。 我如何只提取字符串的 "1234567" 部分? 也许使用这个 Extract digits from string - StringUtils Java 问题的解决方案,但我不知道如何将提取的数字限制在所需的序列上。

如果我在这个字符串上使用 str.replaceAll("[^0-9]", ""),我会得到 "2020032112345670723",这意味着它提取字符串中的所有数字,但我只想要包含特定数字的序列位数(在我的例子中是 7)。

此外,序列不会总是在同一个地方,所以使用 substring(index from, index to) 是行不通的。

我可能会使用 正则表达式 来做到这一点。对于 \d{7} 甚至更好的七个相邻数字 \b\d{7}\b (感谢@AlexRudenko)。

为此,您可能需要使用 Pattern API:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

// ...

Pattern digitPattern = Pattern.compile("\b\d{7}\b");
Matcher m = digitPattern.matcher(<your-string-here>);
while (m.find()) {
    String s = m.group();
    // prints just your 7 digits
    System.out.println(s);
}

我刚刚验证了它,它工作正常。

(模式提取自this answer

你可以做一个简单的 linear search 来找到 length 7:

numeric 子串
public static void main(String[] args) {
        String str = "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours";
        System.out.println(getNumber(str));
}
private static String getNumber(String str) {
        String number = null;
        if(str != null)
            for(String s : str.split(" "))
                if(s.length() == 7 && isNumeric(s))
                    number = s;
        return number;
}
private static boolean isNumeric(String str) { 
        try {  
              Integer.parseInt(str);  
              return true;
        } catch(NumberFormatException e){  
              return false;  
        }  
}

输出:

1234567

假设位数不总是7,我会使用正则表达式

" ([0-9]+) "

里面的部分[0-9]+找一个或多个数字。它左右的空格确保只有在被空格包围的情况下才能找到该数字,因此输入字符串中的日期和时间将被忽略。括号与 group(1) 到 return 组合使用,仅数字周围没有空格。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main
{

    private static final Pattern regexp=Pattern.compile(" ([0-9]+) ");

    public static void main(String[] args)
    {
        String s="This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours";
        Matcher matcher=regexp.matcher(s);
        if (matcher.find())
        {
            String number=matcher.group(1);
            System.out.printf("number=%s",number);
        }
    }
}

要仅查找包含 5 - 8 位数字的数字,您可以编写 " ([0-9]{5,8}) "

正如其他人同时写的那样,\d 可以用作 [0-9] 的替代方法。