Заменить несколько вхождений в одной строке - PullRequest
0 голосов
/ 01 февраля 2020

Я использую Notepad ++ для замены некоторых строк. В основном я хочу сделать следующее:

строка 1 -

STR::P=FOOXPATTERN=5 AND MORETHINGS YPATTERN=9 BUT XPATTERN=3 AND YPATTERN=20

строка 2 -

MOR::P=BAR XPATTERN=1 STRSTR MORETHINGS YPATTERN=1BUT XPATTERN=10 AND YPATTERN=40

...

Так что это должно быть преобразован в:

строка 1

XPATTERN=5|YPATTERN=9|PATTERN=3|YPATTERN=20

строка 2 -

XPATTERN=1|YPATTERN=1|XPATTERN=10|YPATTERN=40

Моя точка зрения заключается в том, что я могу иметь много XPATTERN и много YPATTERN в одной строке. Затем я хотел бы заменить всю мою строку на найденный шаблон.

Я пытался использовать отрицание для регулярных выражений, но безуспешно.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020
  • Ctrl + H
  • Найти что: (?:^|\G(?!^)).*?((?:XPATTERN|YPATTERN)=\d+)(?:(?!(?:XPATTERN|YPATTERN)=).)*($)?
  • Заменить на: $1(?2:|))
  • ПРОВЕРКА Матч
  • ПРОВЕРКА Обтекание
  • ПРОВЕРКА Регулярное выражение
  • UNCHECK . matches newline
  • Заменить все

Пояснение:

(?:                     # non capture group
    ^                       # beginning of line
  |                       # OR
    \G(?!^)                 # restart from last match position, not at the beginning of line
)                       # end group
.*?                     # 0 or more any character but newline
(                       # group 1
    (?:                     # non capture group
        XPATTERN                # XPATTERN
      |                       # OR
        YPATTERN                # YPATTERN
    )                       # end group
    =\d+                    # equal sign followed by 1 or more digits
)                       # end group 1
(?:                     # non capture group
    (?!                     # negative lookahead, make sure we haven't after:
        (?:                     # non capture group
            XPATTERN                # XPATTERN
          |                       # OR
            YPATTERN                # YPATTERN
        )                       # end group
        =                       # equal sign
    )                       # end lookahead
    .                       # any character but newline
)*                      # end group, may appear 0 or more times
($)?                    # group 1, end of line, optional

Замена:

$1              # content of group 1 (i.e. X or Y PATTERN = digits)
(?2             # IF group 2 exists (end of line), do nothing
    :           # ELSE
    |           # add a pipe character
)               # ENDIF

Снимок экрана (до):

enter image description here

Снимок экрана (после):

enter image description here

0 голосов
/ 01 февраля 2020

Используйте регулярное выражение, соответствующее шаблону и чему-либо перед ним, и заменяет его только шаблоном.

Замените: .*?((XPATTERN|YPATTERN|ZPATTERN|...)=\d+)
на: |\1

Если есть что-то после всех шаблонов, вы можете удалить остальные после вышеуказанных замен:

Заменить: ^((\|(XPATTERN|YPATTERN|ZPATTERN|...)=\d+)*).*
С: \1

Это оставит | в начало каждой строки. Вы можете удалить это как третий шаг:

Заменить: ^\|
На: пустая строка

...