Notepad ++ и регулярное выражение - как указать строку регистра между двумя конкретными строками?

У меня есть сотни ссылок на стартовые номера в файле, и они имеют следующий синтаксис:

@article{tabata1999precise,
  title={Precise synthesis of monosubstituted polyacetylenes using Rh complex catalysts. 
Control of solid structure and $\pi$-conjugation length},
  author={Tabata, Masayoshi and Sone, Takeyuchi and Sadahiro, Yoshikazu},
  journal={Macromolecular chemistry and physics},
  volume={200},
  number={2},
  pages={265--282},
  year={1999},
  publisher={Wiley Online Library}
}

Я хотел бы указать регистр (он же «Правильный регистр») для имени журнала в Notepad ++, используя регулярное выражение. Например, от Macromolecular chemistry and physics до Macromolecular Chemistry and Physics.

Я могу найти все экземпляры, используя:

(?<=journal\=\{).*?(?=\})

но я не могу изменить регистр через Правка ›Преобразовать регистр в. Видимо, найти все не получается, и мне приходится идти по одному.

Затем я попытался записать и запустить макрос, но Notepad ++ просто зависает на неопределенное время, когда я пытаюсь его запустить (возможность запускать до конца файла).

Итак, мой вопрос: знает ли кто-нибудь синтаксис replace regex, который я мог бы использовать для изменения регистра? В идеале я бы тоже хотел использовать | исключения для определенных слов, таких как, an, the и т. д. Я попытался поиграть с некоторыми из приведенных примеров здесь, но мне не удалось интегрировать его в свои прогнозы.

Заранее благодарю, буду признателен за любую помощь.


person mk1138    schedule 18.07.2020    source источник


Ответы (2)


Это работает для любого количества слов:

  • Ctrl + H
  • Что найти: (?:journal={|\G)\K(?:(\w{4,})|(\w+))(\h*)
  • Заменить на: \u$1\E$2$3
  • ПРОВЕРИТЬ Обернуть
  • ПРОВЕРИТЬ Регулярное выражение
  • Заменить все

Пояснение:

(?:             # non capture group
    journal={     # literally
  |              # OR
    \G            # restart from last match position
)               # end group
\K              # forget all we have seen until this position
(?:             # non capture group
    (\w{4,})      # group 1, a word with 4 or more characters
  |              # OR
    (\w+)         # group 2, a word of any length
)               # end group
(\h*)           # group 3, 0 or more horizontal spaces

Замена:

\u          # uppercased the first letter of the following
  $1        # content of group 1
\E          # stop the uppercased
$2          # content of group 2
$3          # content of group 3

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

введите описание изображения здесь

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

введите описание изображения здесь

person Toto    schedule 18.07.2020
comment
Очень красивое решение ++ - person The fourth bird; 18.07.2020
comment
Из \G должно быть вычтено начало файла. Вы говорите \G # перезапуск с позиции последнего совпадения - это неверно, поскольку \G совпадает либо с началом строки, либо с концом предыдущего успешного совпадения. Следовательно, ваше регулярное выражение может найти совпадение в начале строки, а не между двумя определенными строками. - person Wiktor Stribiżew; 18.07.2020
comment
Большое спасибо Тото за синтаксис и особенно за подробное объяснение. Я изучаю его и первое, что замечаю, пробуя, - это то, что поиск останавливается из-за знаков препинания. Пробовал запятые, тире, точки и т.д. Постараюсь разобраться. - person mk1138; 18.07.2020
comment
@ mk1138: просто замените \h* на [\h,\-.]* в конце регулярного выражения и скажите мне, работает ли это. - person Toto; 18.07.2020
comment
Оно делает. И из того, что я вижу, его легко дополнить другими персонажами. Я пробовал [\ h, \ -. ~ | ‹] * И некоторые другие символы, и все работает нормально. Еще раз спасибо. Это отличный урок. - person mk1138; 19.07.2020

если формат всегда в форме:

journal = {Макромолекулярная химия и физика},

т.е. журнал за которым следуют 3 слова, затем используйте следующее:

Найдите: journal={(\w+)\s*(\w+)\s*(\w+)\s*(\w+)

Заменить на: journal={\u\1 \u\2 \l\3 \u\4

Вы можете изменить это, если у вас есть другие слова, которые нужно заменить, добавив больше \ u \ x, где x - это позиция слова.

Надеюсь, это поможет дать вам представление о том, как двигаться дальше к лучшему решению.

введите описание изображения здесь

\ u переводит следующую букву в верхний регистр (используется для всех остальных слов)

\ l переводит следующую букву в нижний регистр (используется для слова и)

\ 1 заменяет первую группу поиска capture ()

\ 2 заменяет вторую группу поиска capture ()

\ 3 заменяет третью группу поиска capture ()

person Mohsen Alyafei    schedule 18.07.2020
comment
Спасибо за ответ, Мохсен. У меня случайное количество слов в поле значения. - person mk1138; 19.07.2020