2016-07-07 3 views
0

Я ищу для анализа пользовательского текста разметки, такого как приведенные ниже примеры.Регулярное выражение для правильного сопоставления групп

1 
Post:1 
Image:1|thumb 
Image:1|thumb|html classes here 
1|thumb|html classes here 

Общий формат: ModelName:ID|image_size|html classes

Все, кроме идентификатора после двоеточия (:) является необязательным. Обратите внимание, что идентификатор также может быть строкой. После последнего канала может быть несколько разделенных пробелом классов CSS. Это то, что я до сих пор:

^([\w\.]+)?(?::([-\w\d\.]+))(?:\|(\w+))?(?:\|([-\w\s\d]+))?$ 

Regular expression visualization

Debuggex Demo

Это регулярное выражение имеет несколько вопросов, которые я не могу понять, как исправить

  1. двоеточие появляются перед строкой, которая сливается в main, а не после. Другими словами, двоеточие требуется только в том случае, если присутствует группа 1. (Та же самая идея, как с трубой (|.) До группы 3 и 4.
  2. Регулярное выражение не соответствует 3 последних тестовых случаев в верхней 1 и Post:1 подобраны правильно

ответ

1

Вы могли бы это сделать. с

(?:(\w+):)?(\d+)(?:[^|\n]*\|([^|\n]*)(?:\|(.*))?)? 

это будет захватить первый тег в группе 1, ID в 2-й группы, размер изображения в 3-й и классов в 4-м.

Сначала гр Устанавливает тег (необязательно), затем номер. Вслед за этим группа, также факультативная, сканирует |, а затем захватывает все до другого | или конец строки. Если было найдено |, все это доходит до конца строки.

See it here at regex101.

+0

Спасибо, это определенно шаг в правильном направлении. Тем не менее, мне нужно захватить Image и Post в группе. – danielbker

+0

Отредактировано согласно вашему комментарию :) – ClasG

+0

Я отредактировал ваше исходное регулярное выражение и пришел к тому же ответу !! Спасибо за вашу помощь. Вы эксперт по регулярному выражению! – danielbker

Смежные вопросы