2015-11-17 9 views
1

Я пытаюсь извлечь из следующего примера строки (все в одной строке):Regex - Совпадение несколько групп

First Note Type[br]03/11/2015   12:51:24   USR123[br]Now is the time for all good men to come to the aid of their country[br]Second Note Type[br]03/11/2015   16:26:03   USR456[br]The quick brown fox jumped over the lazy dog. 

2 спички с 5 групп, каждая из, например:

матч 1:

  • G1 -> 'Первый тип Примечание'
  • G2 -> '03/11/2015'
  • G3 -> '12: 51: 24'
  • G4 -> '' USR123
  • G5 -> «Сейчас настало время для всех хороших людей в прийти на помощь своей страны [BR]»

Match 2:

  • G1 -> 'Второй тип Примечание'
  • G2 -> '03/11/2015'
  • G3 -> '16: 26: 03'
  • G4 -> '' USR456
  • G5 -> "Быстрая коричневая лиса перепрыгнула через ленивую собаку.

До сих пор я только смог соответствовать первые 4 группы, используя следующее выражение:

([a-zA-Z\s]+)\\[br\\\]([0-9]+/[0-9]+/[0-9]+)\s+([0-9]+:[0-9]+:[0-9]+)\s+([a-zA-Z0-9]+)\\[br\\] 

не мог получить также пятый (G5) группу, я пытался добавив (.+) но приведет только к одному матчу вместо n

может ли кто-нибудь указать мне в правильном направлении?

ответ

0

Если вы используете (.+), он соответствует одному или нескольким символам, отличным от символа новой строки, столько раз, сколько возможно (поэтому он будет потреблять все до конца строки).

Вы можете сравнить его с следующим регулярным выражением:

([a-zA-Z\s]+)\[br]([0-9]+/[0-9]+/[0-9]+)\s+([0-9]+:[0-9]+:[0-9]+)\s+([a-zA-Z0-9]+)\[br]([^[]*(?:\[(?!br])[^[]*)*(?:\[br])?) 

См regex demo

Я добавил ([^[]*(?:\[(?!br])[^[]*)*(?:\[br])?) часть. Он соответствует всем, кроме [br]. Более подробная разбивка:

  • [^[]* - матч 0 или больше, чем другие [
  • (?:\[(?!br])[^[]*)* символов - соответствует 0 или более последовательностей ...
    • \[(?!br]) - буквальный [ не последовало br]
    • [^[]* - 0 или более символов, кроме [.
  • (?:\[br])? - соответствует 1 или 0 раз буквальное последовательность [br]

Результаты, полученные с помощью строки в качестве входных данных:

enter image description here

+0

спасибо за ваш ответ, я попробовал и Это почти сработало! проблема в том, что мне нужно включить также «[br]» в группу «G5» (см. мой пример M1-G5 заканчивается на «[br]»), я дал плохой пример, в принципе любая группа G5 может содержать несколько " [br] ", есть ли способ достичь этого? – Stefano

+0

просто добавьте его в качестве необязательной группы: '(?: \ [Br])?'. Я обновил ответ. Обратите внимание, что вам не нужно скрывать ']' вне класса символов. –

+0

спасибо, что это сработало! Я не знал о такой возможности, хорошо провел день! – Stefano

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