Regex для дифференциации разделенного числа тысяч и не разделенных тысяч - PullRequest
3 голосов
/ 13 мая 2019

Мне нужно извлечь информацию о цене в заданной текстовой строке.До сих пор я был успешным с нижним регулярным выражением (\\d{1,3}(,\\d{3})*(\\.\\d+)?) в java со строками типа price will be 90,500 USD

Но теперь у меня также есть строки с другим номером до начала цены (eg: for order number 12345 the price will be 100,500 USD).В этом случае мое извлечение цены не удается.Например, приведенное выше даст мне 123 в результате.

Могу ли я использовать регулярное выражение или другой способ извлечения только информации о цене, независимо от того, присутствует другое число или нет?(цена всегда будет разделена тысячами с десятичными точками или без них)

ниже приведен полный код, который я сейчас использую для этой работы:

private String getPrice(String fileText) {
    String lines[] = fileText.split(System.lineSeparator());

    for (String line : lines) {
        Pattern p = Pattern.compile("(\\d{1,3}(,\\d{3})*(\\.\\d+))");
        Matcher m = p.matcher(line);
        if (m.find()) {
            return m.group(0);
        }

        p = Pattern.compile("(\\d{1,3}(,\\d{3})*(\\.\\d+)?)");
        m = p.matcher(line);
        if (m.find()) {
            return m.group(0);
        }   
    }       
    return "";
}

Я ожидаю, что совпадение будет в словеуровень.(eg: 123 of 12345 should not match.) Мой разделитель слов только space.123-456 считается одним словом.Так что из 123456, 123-456, 123,456, 123,456.56, A123456 только 123,456, 123,456.56 должны совпадать.Проблема в том, что мой текущий код извлекает 123 из 123456, 123-456 и A123456

1 Ответ

1 голос
/ 13 мая 2019

Ваше регулярное выражение соответствует номеру в любом контексте, а десятичная часть обязательна.

Я предлагаю:

  • Соответствие номеру только в том случае, если оно не заключено в символы слова
  • Использование необязательной группы без захвата вокруг шаблона части числа дроби.

Используйте

Pattern p = Pattern.compile("\\b\\d{1,3}(?:,\\d{3})*(?:\\.\\d+)?\\b");

См. Демонстрационную версию regex .

Шаблоны \b представляют собой границы слов, а (?:...)? в (?:\\.\\d+)? - это группа без захвата, которая повторяется один или ноль раз, т.е. является необязательной.

...