Я скажу прямо: я ужасен с регулярными выражениями. Я пытался придумать один, чтобы решить мою проблему, но я действительно мало о них знаю. . .
Представьте себе несколько предложений следующего содержания:
- Привет, бла-бла. Это около 11 1/2 дюймов на 32 дюйма.
- Размеры 8 х 10-3 / 5!
- Вероятно, где-то в районе 22 x 17 дюймов.
- Рулон довольно большой: 42 1/2 дюйма на 60 ярдов.
- Все они имеют размер 5,76 на 8 кадров.
- Да, может быть, это около 84 см в длину.
- Я думаю о 13/19 ». .
- Нет, наверное, 86 см.
Я хочу как можно точнее извлечь измерения предмета из этих предложений. В идеальном мире регулярное выражение будет выводить следующее:
- 11 1/2 "x 32"
- 8 x 10-3 / 5
- 22 "x 17"
- 42 1/2 "x 60 ярдов
- 5,76 на 8
- 84 см
- 13/19 "
- 86 см
Я представляю себе мир, в котором действуют следующие правила:
{ см, мм, ярд, ярды, ", ', футы}
, хотя я бы предпочел решение, которое учитывает произвольный набор единиц, а не явное решение для вышеуказанных единиц. 4/5 "
. /
, разделяющие числитель / знаменатель, и можно предположить, что между частями нет пробела (хотя, если кто-то примет это во внимание, это здорово!). {x, by}
. Если размер только одномерный, он должен иметь единицы измерения из набора выше, то есть 22 см
в порядке, .333
нет, и не 4,33 унции
. Чтобы показать вам, насколько я бесполезен с регулярными выражениями (и чтобы показать, что я хотя бы пытался!), Я зашел так далеко. . .
[1-9]+[/ ][x1-9]
Обновление (2)
Ребята, вы очень быстрые и эффективные! Я собираюсь добавить несколько дополнительных тестовых примеров, которые не были охвачены регулярными выражениями ниже:
- Предпоследний тестовый пример - 12 ярдов x.
- Последний тестовый пример - 99 см.
- В этом предложении нет измерений: 342/5553/222.
- Три измерения? 22 "x 17" x 12 см
- Это код продукта: c720 с другим номером 83 x лучше.
- Само по себе число 21.
- Объем не должен соответствовать 0,332 унции.
В результате должно получиться следующее (# означает, что ничего не должно совпадать):
- 12 ярдов
- 99 см
- #
- 22 "x 17" x 12 см
- #
- #
- #
Я адаптировал ответ M42 ниже к:
\d+(?:\.\d+)?[\s-]*(?:\d+)?(?:\/\d+)?(?:cm|mm|yd|"|'|feet)(?:\s*x\s*|\s*by\s*)?(?:\d+(?:\.\d+)?[\s*-]*(?:\d+(?:\/\d+)?)?(?:cm|mm|yd|"|'|feet)?)?
Но хотя это решает некоторые новые тестовые примеры, теперь оно не соответствует следующим другим.В нем сообщается:
- ПРОХОДИТ 11 1/2 "x 32"
- (ничего) НЕ ИСПОЛЬЗУЕТСЯ
- ПРОХОДИТ 22 "x 17"
- ПРОХОДИТ 42 1/2 "x 60 ярдов
- (ничего) НЕ ИСПОЛЬЗУЕТСЯ
- ПРОШЕЛ 84 см
- ПРОХОД 13/19 "
- ПРОХОД 86 см
- 22" ПРОХОД
- (ничего) ОТКАЗ
(ничего) ОТКАЗ
12 ярдов x ОТКАЗ
- 99 cm by FAIL
- 22 "x 17" [а также, но отдельно '12 cm '] FAIL
PASS
PASS