Как я могу найти конкретный символ в строках между двумя словами?

У меня возникли проблемы с регулярным выражением, которое мне нужно для поиска/замены в Notepad++. Я хотел бы найти/заменить определенный символ в строках между двумя словами

например

msgid "flower"
"test hold"
msgstr

Я хотел бы найти несколько символов o между msgid " и msgstr и заменить на символ a. Результат

msgid "flawer"
"test hald"
msgstr

Вы используете язык программирования здесь?

Tim Biegeleisen 24.01.2023 03:02

Я нуби, извини, я не знаю, что ты имеешь в виду.

Attawat Viriyopase 24.01.2023 03:06

@Tim Я думаю, что регулярные выражения Notepad ++ используют библиотеку регулярных выражений Boost v1.80 (начиная с NPP v8.4.7), которая основана на синтаксисе PCRE (Perl Compatible Regular Expression).

Jerry Jeremiah 24.01.2023 03:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
79
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Здесь я написал регулярное выражение для выполнения описанного выше действия. Если вы замените o тем, что вы ищете, вы сможете найти и зафиксировать это.

Это написано с учетом механизма регулярных выражений PCRE. (То, что я смог найти, это тот, который работает в Notepad ++)

(?<=msgid ")(.*)(o)(.*)(?= msgstr)

Ниже приводится заявление о замене. a можно заменить тем, чем вы хотите заменить захваченный текст. $1 представляет все, что находится после msgid " и до искомого текста. $3 представляет собой все, что находится после захваченного оператора и до msgstr. Если вы хотите использовать захваченный текст в любом месте оператора замены, вы можете сослаться на него с помощью $2.

$1a$3

Проблема с этим подходом в том, что он будет работать только с одним o между маркерами.

Tim Biegeleisen 24.01.2023 03:13

Вау, большое спасибо, я пойду на тест. Если у меня есть какие-либо вопросы, пожалуйста, дайте мне спросить еще раз :)

Attawat Viriyopase 24.01.2023 03:23

@TimBiegeleisen Да, приведенное утверждение заменит только o, однако, если вы прочитаете описание выше, в нем говорится, что вы можете заменить o любым другим выражением, которое вы ищете. Здесь предполагается, что пользователь будет искать обычный текст, но он также будет работать для регулярных выражений, соответствующих тому, что им нужно.

holtkampjs 24.01.2023 03:29

@holtkampjs Что делать, если между маркерами несколько o? Вы хотите заменить их все или только один из них? Поскольку этот ответ заменяет только последнее появление o.

Hao Wu 24.01.2023 03:35

@holtkampjs Спасибо за ваш ответ, это работает, но если есть много символов o, как изменить регулярное выражение, чтобы заменить a на несколько o? Большое спасибо

Attawat Viriyopase 24.01.2023 03:51

@AttawatViriyopase Если вы хотите заменить a несколькими o (группа захвата), вы просто поместите $2 в оператор замены, где вы хотите. Например, поставив 3 o в операторе замены, это будет выглядеть так $1$2$2$2$3

holtkampjs 24.01.2023 04:33
Ответ принят как подходящий

Это выглядит очень запутанным, но должно работать во всех случаях:

((?:^.*?msgid "|\G)(?:(?!msgstr)[\s\S])*?)o(?=(?:(?!msgid ")[\s\S])*?msgstr)

Заменить

$1a

Смотрите тестовые примеры здесь

По сути, он сопоставляет os после просмотра msgid ", после этого получает конец предыдущего совпадения, используя \G, и продолжает сопоставлять остальные os, прежде чем встретить msgstr.

Отлично!! Я протестировал это регулярное выражение, и оно работает во всех случаях, большое спасибо!!

Attawat Viriyopase 24.01.2023 05:14

Другие вопросы по теме