Мой простой Javascript RegExp для разбора заказов на еду смеется надо мной - PullRequest
0 голосов
/ 07 декабря 2018

Я застрял с этим простым регулярным выражением, которое я пишу для разбора заказов на еду.Я получаю каждый заказ в виде объекта 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

Я чувствую, что я очень близок.Мне просто нужно немного подтолкнуть ...

Спасибо за вашу помощь!

1 Ответ

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

Это не идеально, но это то, что я в итоге сделал:

/^\*?([\w \u00a0-\u0200]+)\*? *:\*? *(.+)/gm

https://regex101.com/r/ymvYb1/4

Я мог бы дать ему еще один шанс, но сейчас... оно работает!: -)

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