Разбор числовой информации из строки ингредиента с помощью регулярных выражений - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь извлечь информацию о количестве из строки ингредиента, где единица уже удалена.

175 risotto rice
a little hot vegetable stock (optional)
1     coriander
salt pepper
1 0.5   extra virgin olive oil
1  mild onion
300 split red lentils
1.7   well-flavoured vegetable stock
4  carrots
1 head celery
100 stilton cheese
4   snipped  chives
salt pepper
225 dried flageolet beans

Это примеры строк, которые я анализирую, и результаты должны выглядеть следующим образом:

175

1

1 0.5
1
300
1.7
4
1
100
4

225

Мое текущее мышление использует [0-9]+[ ]*[0-9]*.?[0-9]* в качестве регулярного выражения, однако этовыбирая первый символ после числовых значений, например, рис ризотто 175 возвращает «175 р»

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Проблема здесь в том, что вы не экранируете .? в литерал \.?.Точное поведение до сих пор мне не совсем понятно, но использование вашего паттерна и экранирование . в нем уже должны обеспечить вам желаемое поведение соответствия.

Обратите внимание, что вы можете сократить [0-9] до \d:

^\d+\s*\d*\.?\d*

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

0 голосов
/ 31 декабря 2018

В вашем регулярном выражении вы соответствуете .?, который будет соответствовать необязательному символу (любому символу, кроме символа новой строки), а в ваших данных будет, например, r в ризотто или c в кориандре.

Вы можете использовать якорь, чтобы утверждать начало строки и сопоставлять цифры 1+, а затем необязательную часть, которая соответствует точке и цифрам 1+.

После этого матча вы можете добавить тот же необязательный шаблон с начальными пробелами или табуляцией 1+:

^\d+(?:\.\d+)?(?:[ \t]+\d+(?:\.\d+))?

В Java

String regex = "^\\d+(?:\\.\\d+)?(?:[ \\t]+\\d+(?:\\.\\d+))?";

Это будет соответствовать

  • ^ начало строки
  • \d+(?:\.\d+)? Совпадение цифр 1+, за которыми следует необязательная часть ?, которая соответствует точке и цифрам 1+
  • (?: Группа без захвата
    • [ \t]+\d+(?:\.\d+) соответствует 1+ разу пробелу или табуляции, 1+ цифрам и снова сопровождается необязательной частью, которая соответствует точке и 1+ цифрам
  • )? Закройте группу без захвата и сделайте ее необязательной

Обратите внимание, что если вы хотите сопоставить второй шаблон 0+ раз вместо того, чтобы сделать его необязательным, вы можете использовать * вместо ?

Regex demo | Java демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...