RegEx для захвата строки символов одновременно - PullRequest
1 голос
/ 17 мая 2019

Мне нужно создать фильтр на основе регулярных выражений (регулярное выражение).Вот пример:

Обязательно создать фильтр, который может фильтровать оба из этих двух имен файлов данных:

ZVSEBACTAA.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202SCTAAAAAAAA.I
ZVSEBADD11.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202COR11111111.I

Чтобы включить все предложения для них обоих, мы имеемэто регулярное выражение (уже выполнено):

(^(ZVSEBACT|ZVSEBADD)[A-Z,0-9]{2}\.PACS_\.0230\.)(.*)\.EBA\.(S202(SCT|COR))([A-Z,0-9]{8})\.I$

Однако мне нужно найти один фильтр для фильтрации только из AAAAAAAA (всего 8 длинных строк символов), но также можно заменить на 11111111 (то же самоетоже, но в данном случае по номерам), во всех случаях все 8 символов могут быть числом или взаимозаменяемыми символами.

Фильтр, который я создал (использовал Notepad ++ в качестве инструмента кодирования):

([A-Z,0-9]{8})\.I$

Это означает, что я хочу отфильтровать строку символов с 8 длинами, но мои сомнения в конце, я не знаю, как выбрать только до последней A (или 1), чтобы покрыть AAAAAAAAA вв первом ряду и 11111111 во втором ряду.

После создания фильтра следует выбрать AAAAAAAAA и 11111111, но на самом деле это выбрать AAAAAAAAAA.I и 11111111.I в каждом из них.

ZVSEBACTAA.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202SCTAAAAAAAA.I
ZVSEBADD11.PACS_.0230.[YYYYMMDDhhmmss].[Q5].EBA.S202COR11111111.I

Нет ошибок или предупреждений, но следует пропустить конец (.I), ожидая, что он охватит только 8 упомянутых позиций.

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Вы сказали, что используете Notepad ++, вот путь:

  • Ctrl + F
  • Найти что: ^ZVSEB(?:ACT|ADD)[A-Z0-9]{2}\.PACS_\.0230\..+?\.EBA\.S202(?:SCT|COR)\K[A-Z0-9]{8}(?=\.I$)
  • check Wrap вокруг
  • check Регулярное выражение
  • UNCHECK . matches newline
  • Найти все в текущем документе

Пояснение:

^                   # beginning of line
ZVSEB               # literally
(?:ACT|ADD)         # non capture group, ACT or ADD
[A-Z0-9]{2}         # 2 uppercase or digit
\.PACS_\.0230\.     # literally
.+?                 # 1 or more any character, not greedy
\.EBA\.S202         # literally
(?:SCT|COR)         # non capture group, SCT or COR
\K                  # forget all we have seen until this position
[A-Z0-9]{8}         # 8 uppercase or digit
(?=\.I$)            # positive lookahead, make sure we have after: .I then end of line

Снимок экрана:

enter image description here

Демонстрация на regex101

1 голос
/ 17 мая 2019

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

Например:

(\b(ZVSEBACT|ZVSEBADD)[A-Z,0-9]{2}\.PACS_\.0230\.)(.*?)\.EBA\.(S202(SCT|COR))([A-Z,0-9]{8})(?=\.I\b)

Пара вещей, которые я изменил:

Символ . в регулярном выражении является подстановочным знаком, поэтому я сделал их \. в тех местах, где, кажется, вы на самом деле ищете символ .. Текст, который я скопировал / вставил сверху, вставлен в одну строку, поэтому я изменил ^ и $ на \ b (границы слов), что позволяет нескольким совпадениям в одной строке соответствовать обоим числам.

При добавлении (?=\.I\b) выполняется поиск (после захвата), чтобы гарантировать, что следующие символы будут .I с последующим концом слова (т. Е. Концом документа или пробелом и т. Д.) Без их захвата.

Попробуйте на regex101 и дайте мне знать, если это не то, что вы хотели!

...