Как извлечь последовательность из 7 чисел из строки в Java? - PullRequest
1 голос
/ 26 мая 2020

Допустим, у меня есть объект String, содержащий "This sentence was written on 2020-03-21 by person 1234567 at 07:23 hours". Как мне извлечь ТОЛЬКО часть строки "1234567"? Возможно, используя решение из этого Извлечь цифры из строки - StringUtils Java вопрос, но я не знаю, как ограничить извлеченные числа только в желаемой последовательности.

Если бы я используйте str.replaceAll("[^0-9]", "") в этой строке, я бы получил "2020032112345670723", что означает, что он извлекает ВСЕ числа в строке, но мне нужна ТОЛЬКО последовательность, содержащая определенное количество цифр (в моем случае 7).

Кроме того, последовательность не всегда будет в одном и том же месте, поэтому использование substring(index from, index to) не будет работать.

Ответы [ 3 ]

3 голосов
/ 26 мая 2020

Я бы, вероятно, сделал это, используя регулярное выражение . Для семи цифр смежности это будет \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);
}

Я только что проверил его, и он работает нормально.

(Извлечение шаблона взято из этот ответ

1 голос
/ 26 мая 2020

Предполагая, что количество цифр не всегда равно 7, я бы использовал регулярное выражение

" ([0-9]+) "

Внутренняя часть [0-9]+ находила одну или несколько цифр. Пробелы слева и справа от него гарантируют, что число будет найдено только в том случае, если оно окружено пробелами, поэтому дата и время в вашей строке ввода игнорируются. Скобки используются в сочетании с group(1), чтобы возвращать только число без пробелов вокруг него.

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].

0 голосов
/ 26 мая 2020

Вы можете сделать простой linear search, чтобы найти подстроку numeric из length 7:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...