Regex - несколько матчей - PullRequest
1 голос
/ 22 марта 2012

Как исправить это регулярное выражение, чтобы получить упомянутый результат?

регулярное выражение: (0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*])

строка: LCR005B"*ADM-CID"9876R579BDFL789ABC#12345A[4D32FC2B12345A|113002065][Vanydata][M1234567890AB][Panydata]

результат должен быть:

  1. 005B
  2. "* ADM-CID"
  3. 9876
  4. R579BDF
  5. L789ABC
  6. # 12345A
  7. [4D32FC2B12345A | 113002065]
  8. [Vanydata]
  9. [M1234567890AB]
  10. [Panydata]

Позже редактировать:

В настоящее время выводится:

  1. 005B
  2. "* ADM-CID"
  3. 9876
  4. R579BDF
  5. L789ABC
  6. # 12345A
  7. [4D32FC2B12345A | 113002065]
  8. [Vanydata]

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Это ваше регулярное выражение:

(0(?:[0-9]|[A-F]){3})
(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")
(\d{4})
(R?(?:[0-9]|[A-F])*)
(L[^#]*)
(#[^\[]*)
(\[[^\[]*)
(\[(?:M|V|P)(?:[^\[])*])

У вас есть только 8 групп захвата , ни одна из них не повторяется. Как вы думаете, почему должно получиться 10 групп?

ОК, из-за (?:M|V|P) последней группы, он мог бы соответствовать содержимому 3 последних квадратных скобок, но эта группа не повторяется, поэтому она будет соответствовать только первой.

У вас есть 2 возможности.

  1. Поставьте квантификатор за последней группой

    (0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*])+
    

    или

    (0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*]){3}
    

    теперь будет соответствовать строке до конца, но осталось только 8 групп захвата, и содержимое последней группы больше не является "[Vanydata]", это последнее совпадение этой группы "[Panydata]"

  2. Добавьте еще две группы к своему регулярному выражению

    (0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(?:M|V|P)(?:[^\[])*])(\[(?:M|V|P)(?:[^\[])*])(\[(?:M|V|P)(?:[^\[])*])
    

    Теперь у него есть 10 групп захвата, и результат такой, как вы ожидали. Если начальная буква этих трех последних групп всегда одинакова для каждой группы, вы можете упростить ее до

    (0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[V(?:[^\[])*])(\[M(?:[^\[])*])(\[P(?:[^\[])*])
    

    Посмотрите здесь на Regexr

Обновление

Вы можете сделать что-то необязательное, добавив после него знак вопроса

(0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[[VMP](?:[^\[])*])?(\[[VMP](?:[^\[])*])?(\[[VMP](?:[^\[])*])?

См. здесь, в Regexr , при наведении курсора на совпадение отображается содержимое групп захвата.

0 голосов
/ 22 марта 2012

Что ж, проблема, похоже, в последней группе Regex захвата.(\[(?:M|V|P)(?:[^\[])*]) не похоже на работу.

Эта группа захвата регулярных выражений \[(\w.*|(M|V|P)\d{10}AB)\] ловит ваши последние 3 слова в скобках.

Полное регулярное выражение: (0(?:[0-9]|[A-F]){3})(\"\*?(?:SIA-DCS|ADM-CID|NULL)\")(\d{4})(R?(?:[0-9]|[A-F])*)(L[^#]*)(#[^\[]*)(\[[^\[]*)(\[(\w.*|(M|V|P)\d{10}AB)\])

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