Regex для сбора данных из описания - PullRequest
0 голосов
/ 01 апреля 2009

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

14-каратное желтое золото 152, Подлинная Аметист, Подлинная Бриллиант, Имитация Изумруда, Премиум Топаз, Турмалин Премиум, Подлинный Сапфир, Гравюры: Джим, Джейк, Джон, Джефф, Роб, Сэнди, Бэнд Гравюра: кузнец

Мне нужно захватить:

А) стиль (Стиль 152) (стиль + любое число)

B) золото (14-каратное желтое золото) (могут быть комбинации из 14-каратного, 10-каратного, желтого или белого цвета)

C) камни (Подлинный Аметист, Подлинный Алмаз, Имитация Изумруда, Премиум Топаз, Премиум Турмалин, Подлинный Сапфир) (их количество может меняться, но всегда как минимум 1)

D) гравюры (Джим, Джейк, Джон, Джефф, Роб, Сэнди) (это может быть 0 или больше, и строка Гравюры: не будет, если нет имен)

E) гравировка на полосе (смит) (это также необязательно, и строка гравировка на полосе: не будет, если имени тоже нет)

Я работаю с обычными эспрессонами уже несколько месяцев, но это немного над моей головой, так как может очень много ... это лучший, который я придумал, но он не работает, если строка Гравюры: исчезло:

/(\d{2}.+gold).+(style \d+)(.+)engravings:([^\*]*)(\*)?(.*)/i

СПАСИБО!

Ответы [ 4 ]

1 голос
/ 02 апреля 2009

Почему бы просто не разбить его на несколько регулярных выражений? Таким образом, вы можете проверить, включены ли «гравировки» в строку, а затем либо заполнить значение гравировки, либо оставить его пустым.

0 голосов
/ 07 апреля 2009

... может быть комбинацией 14kt, 10kt, желтого или белого цвета ...

Я действительно не думаю, что здесь нужно регулярное выражение. Это не всегда уместно.

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

Если вы знаете, что порядок на 100% непротиворечив, тогда вы, вероятно, можете создать для этого одно регулярное выражение, но я думаю, что это потребует больше усилий, чем оно того стоит. Возможно, есть лучшие варианты - это поможет узнать, какой язык вы используете.

0 голосов
/ 02 апреля 2009
/(\d{2}.+gold).+(style \d+)(.+?)(engravings:.*?)?(band engraving:.*)?/i

может делать что хочешь

0 голосов
/ 02 апреля 2009

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

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