Notepad ++ Regex: вставить новую строку с текстом 'found' после последнего вхождения слова '$ apple' - PullRequest
0 голосов
/ 06 февраля 2020

Полный вопрос:

Вставьте новую строку с текстом found после последнего вхождения слова $apple. Если не найдено, попробуйте то же самое для слова $orange в том же файле.

Пример: Файл abc.txt

$apple
$orange

после выполнения регулярного выражения:

$apple
found
$orange

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020
  • Ctrl + H
  • Найти что: (\$apple)(?!.*\$apple)|((?:(?!\$apple).)*?)(\$orange)(?!.*(?:\$orange|\$apple))
  • Заменить на: (?1$1\nfound:(?3$2$3\nfound))
  • ПРОВЕРКА Матч
  • ПРОВЕРКА Обтекание
  • ПРОВЕРКА Регулярное выражение
  • CHECK . matches newline
  • Заменить все

Пояснение:

  (\$apple)                     # group 1, literally $apple
  (?!.*\$apple)                 # negative lookahead, make sure we haven't $apple after
|                           # OR
  ((?:(?!\$apple).)*?)          # group 2, everything that is not $apple
  (\$orange)                    # group 3, literally $orange
  (?!.*(?:\$orange|\$apple))    # make sure we haven' $orange or $apple after

Замена:

(?1                 # if group 1 exists (we have found $apple)
    $1                  # content group 1
    \n                  # linefeed, you may use \r\n for wondows EOL
    found               # literally found
  :                 # else
    (?3                 # if group 3 exists ($orange)
        $2                  # content of group 2
        $3                  # content of group 3
        \n                  # linefeed, you may use \r\n for wondows EOL
        found               # literally found
    )                   # endif
)                   # endif

С $ apple И $ оранжевый

Экран захват (до):

enter image description here

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

enter image description here


только с $ оранжевым

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

enter image description here

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

enter image description here

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

Попробуйте найти и заменить в режиме регулярных выражений с включенной точкой все:

Find:    (\$apple(?!.*\$apple)|\$orange(?!.*\$orange))
Replace: found

Демо

Чтобы понять, как выше чередование регулярных выражений, рассмотрим первую половину, которая охватывает поиск $apple:

\$apple(?!.*\$apple)

Это будет соответствовать $apple, но только если в тексте не может быть найдено другое вхождение (т.е. это последнее вхождение). Лог c для сопоставления с последним $orange идентичен, но обратите внимание, что поиск $orange будет запускаться только в том случае, если $apple нигде не будет найдено.

...