Я застрял с этим простым регулярным выражением, которое я пишу для разбора заказов на еду.Я получаю каждый заказ в виде объекта JSON, что-то вроде этого:
{"text": "order"}
Правила
Люди заказывают еду почти одинаково, но не совсем.Поэтому я решил установить некоторые правила того, что я считаю заказом на еду, чтобы иметь возможность его анализировать.
- базовый формат:
{"text": "restaurant name: food order"}
[1-10,16,17]
restaurant name
равен всегда в начале text
[1-10]
- есть пробелов предшествующих
restaurant name
[1-10]
- иногда
restaurant name
будет жирным шрифтом [2,5,7,8]
- иногда даже
:
будет жирным шрифтом [3,6,10]
- иногда символы Unicode присутствуют в названии ресторана
[8]
- иногда символы Unicode присутствуют в заказе еды
[1-10]
- иногда, заказ еды охватывает несколько строк
[3-6,8-10]
- иногда несколько заказов в
text
[8-10]
Действительные заказы на питание
Это действительные заказы на питание, которые регулярное выражение должно уметь анализировать:
[1] {"text": "Xanacuk: Ensalada de Espinacas + Crema del d\u00eda. :grin: "}
[2] {"text": "*Xanacuk*: Ensalada de Espinacas + Crema del d\u00eda"}
[3] {"text": "*Xanacuk:*\nEnsalada de Espinacas + Crema del d\u00eda. Thanks! :sunglasses: "}
[4] {"text": "pok\u00e9 restaurant:\n1- Crea tu Bowl: At\u00fan, Smoked Paprika, Cebolla Roja\n1- Salm\u00f3n Wasabi Pomelo"}
[5] {"text": "*POKE restaurant*:\n1- Crea tu Bowl: At\u00fan, Smoked Paprika, Cebolla Roja\n1- Salm\u00f3n Wasabi Pomelo"}
[6] {"text": "*POKE restaurant:*\n1- Crea tu Bowl: At\u00fan, Smoked Paprika, Cebolla Roja\n1- Salm\u00f3n Wasabi Pomelo"}
[7] {"text": "*Xanacuk Place*: Ensalada de dise\u00f1o peque\u00f1a (base espinacas + jam\u00f3n cocido + at\u00fan + aceite extra virgen) + mollete malasa\u00f1a. Gracias!"}
[8] {"text": "*Ohana Pok\u00e9 House*: Bowl - Arroz Negro Salvaje, At\u00fan, Tuna flakes, Zanahoria, Edamame , Wakame, Nori Furikake\n*Tierra Burrito*: Cookie Doble Chocolate"}
[9] {"text": "Poke Bowl: Bowl , \nBaby Spinach , \nAt\u00fan, \nSiracha de Manzana, Tuna Flakes, Pepino, Edamame , Cacahuete, Granada\n*Tierra Burrito*: Cookie Doble Chocolate"}
[10] {"text": "*Poke:* Bowl , \nBaby Spinach , \nAt\u00fan, \nSiracha de Manzana, Tuna Flakes, Pepino, Edamame , Cacahuete, Granada\n*Tierra Burrito*: Cookie Doble Chocolate "}
Неправильные заказы на еду
Они не соответствуют правилам, поэтому регулярное выражение должно возвращаться null
:
[11] {"text: ":heart: everywhere"}
[12] {"text: "this is not a food order"}
[13] {"text: "Mike +1"}
[14] {"text: "It\u2019s hot in here :fire:"}
[15] {"text: "we need to talk"}
Ложные срабатывания
Естественно, сНекоторые ложные срабатывания неизбежны, это нормально:
[16] {"text: "Hey: :heart:"}
[17] {"text: "Jim: come here"}
Разобранные заказы еды
Итак, ожидаемые результаты:
[1] restaurant: "Xanacuk"
order: "Ensalada de Espinacas + Crema del día"
[2] restaurant: "Xanacuk"
order: "Ensalada de Espinacas + Crema del día"
[3] restaurant: "Xanacuk"
order: "Ensalada de Espinacas + Crema del día. Thanks! :sunglasses:"
[4] restaurant: "poké restaurant"
order: "1- Crea tu Bowl: Atún, Smoked Paprika, Cebolla Roja
1- Salmón Wasabi Pomelo"
[5] restaurant: "POKE restaurant"
order: "1- Crea tu Bowl: Atún, Smoked Paprika, Cebolla Roja
1- Salmón Wasabi Pomelo"
[6] restaurant: "POKE restaurant"
order: "1- Crea tu Bowl: Atún, Smoked Paprika, Cebolla Roja
1- Salmón Wasabi Pomelo"
[7] restaurant: "Xanacuk Place"
order: "Ensalada de diseño pequeña (base espinacas + jamón cocido + atún + aceite extra virgen) + mollete malasaña. Gracias!"
[8] restaurant: "Ohana Poké House"
order: "Bowl - Arroz Negro Salvaje, Atún, Tuna flakes, Zanahoria, Edamame , Wakame, Nori Furikake"
restaurant: "Tierra Burrito"
order: "Cookie Doble Chocolate"
[9] restaurant: "Poke Bowl"
order: "Bowl ,
Baby Spinach ,
Atún,
Siracha de Manzana, Tuna Flakes, Pepino, Edamame , Cacahuete, Granada"
restaurant: "Tierra Burrito"
order: "Cookie Doble Chocolate"
[10] restaurant: "Poke"
order: "Bowl ,
Baby Spinach ,
Atún,
Siracha de Manzana, Tuna Flakes, Pepino, Edamame , Cacahuete, Granada"
restaurant: "Tierra Burrito"
order: "Cookie Doble Chocolate"
[11] null
[12] null
[13] null
[14] null
[15] null
[16] restaurant: "Hey"
order: ":heart:"
[17] restaurant: "Jim"
order: "come here"
Примечание: restaurant
и order
всегда обрезаются, и любая новая строка в начале и конце также должна быть удалена
Мое решение
После выполнения JSON.parse(event)
Я применяю свое регулярное выражение к event.text
.
До сих пор я смог придумать это регулярное выражение:
/\*?([\w ]+)\*?:\*?(?:\s*)((\n|.)+)/gm
Регулярное выражение воляработать с [1-3,5-7,11-17]
Regex не будет работать с:
[4]
: Unicode в restaurant name
[8-10]
: два порядка в text
Regex создает третью группу захвата, которая не эстетически приятна, но я просто игнорирую ее ... :-)
regex snippets: https://regex101.com/r/AbtLgm/13
Я чувствую, что я очень близок.Мне просто нужно немного подтолкнуть ...
Спасибо за вашу помощь!