Если текстовые варианты всегда строятся одинаково, регулярные выражения могут быть одним из способов решения этой проблемы. По сути, вы проверяете каждый текст по набору выражений и смотрите, соответствуют ли они или нет. В зависимости от того, насколько отличаются варианты, выражения могут быть простыми или могут быть более сложными.
Для приведенного выше случая первое выражение может выглядеть так:
COMP 150.00 MG X 20.00 UN
-> (identifier) (capsule weight) X (num units)
Отсюда можно получить следующее выражение:
^COMP (\d+(?:\.\d+)?) MG X ([\d]+(?:\.\d+)?) UN$
(это предполагает, что количество пробелов всегда равно и что вы всегда используете MG
и UN
).
Второе выражение:
150 mg comp.rec.x 20
-> (capsule weight) comp.rec.x (num packages)
Может быть получено следующее выражение:
^(\d+(?:\.\d+)?) mg comp\.rec\.x (\d+(?:\.\d+)?)$
Вы увидите, что оба выражения дважды содержат следующую часть: ([\d]+(?:\.\d+)?)
Эти части записывают числа в группу и позволяют вам затем анализировать этот текст, например, в Double
.
Вот краткая разбивка этого под-выражения:
( ... )
- это группа захвата, т. Е. Вы можете получить доступ к части, которая непосредственно соответствует этой группе
\d+
означает одну или несколько цифр
\.
- буквальная точка
(?: ... )
- это группа без захвата, то есть вы можете применять квантификаторы, но не можете напрямую получить доступ к соответствующим частям
Из вышеперечисленных частей вы получаете следующее:
(?:\.\d+)?
означает не более одной точки, за которой следует хотя бы одна цифра. Это будет соответствовать .123
, но не .1.2.3
или 1.
(\d+(?:\.\d+)?)
означает, по крайней мере, одну цифру, за которой необязательно следует точка, за которой следует, по крайней мере, еще одна цифра. Это будет соответствовать 1.23
, 12.3
или 123
, но не 1.
, .2
или 1.2.3
.
Если у вас есть эти выражения, примените правильное выражение к тексту (если вы его знаете, сначала протестируйте) и извлеките обе группы. Затем сравните значения этих групп.
Примечание: не забывайте, что в строках Java вы должны избегать обратной косой черты, поэтому \d
будет записано как "\\d"
и т. Д.