У меня возникли проблемы с регулярным выражением, которое мне нужно для поиска/замены в Notepad++. Я хотел бы найти/заменить определенный символ в строках между двумя словами
например
msgid "flower"
"test hold"
msgstr
Я хотел бы найти несколько символов o
между msgid "
и msgstr
и заменить на символ a
. Результат
msgid "flawer"
"test hald"
msgstr
Я нуби, извини, я не знаю, что ты имеешь в виду.
@Tim Я думаю, что регулярные выражения Notepad ++ используют библиотеку регулярных выражений Boost v1.80 (начиная с NPP v8.4.7), которая основана на синтаксисе PCRE (Perl Compatible Regular Expression).
Здесь я написал регулярное выражение для выполнения описанного выше действия.
Если вы замените o
тем, что вы ищете, вы сможете найти и зафиксировать это.
Это написано с учетом механизма регулярных выражений PCRE. (То, что я смог найти, это тот, который работает в Notepad ++)
(?<=msgid ")(.*)(o)(.*)(?= msgstr)
Ниже приводится заявление о замене. a
можно заменить тем, чем вы хотите заменить захваченный текст. $1
представляет все, что находится после msgid "
и до искомого текста. $3
представляет собой все, что находится после захваченного оператора и до msgstr
. Если вы хотите использовать захваченный текст в любом месте оператора замены, вы можете сослаться на него с помощью $2
.
$1a$3
Проблема с этим подходом в том, что он будет работать только с одним o
между маркерами.
Вау, большое спасибо, я пойду на тест. Если у меня есть какие-либо вопросы, пожалуйста, дайте мне спросить еще раз :)
@TimBiegeleisen Да, приведенное утверждение заменит только o
, однако, если вы прочитаете описание выше, в нем говорится, что вы можете заменить o
любым другим выражением, которое вы ищете. Здесь предполагается, что пользователь будет искать обычный текст, но он также будет работать для регулярных выражений, соответствующих тому, что им нужно.
@holtkampjs Что делать, если между маркерами несколько o
? Вы хотите заменить их все или только один из них? Поскольку этот ответ заменяет только последнее появление o
.
@holtkampjs Спасибо за ваш ответ, это работает, но если есть много символов o, как изменить регулярное выражение, чтобы заменить a на несколько o? Большое спасибо
@AttawatViriyopase Если вы хотите заменить a
несколькими o
(группа захвата), вы просто поместите $2
в оператор замены, где вы хотите. Например, поставив 3 o в операторе замены, это будет выглядеть так $1$2$2$2$3
Это выглядит очень запутанным, но должно работать во всех случаях:
((?:^.*?msgid "|\G)(?:(?!msgstr)[\s\S])*?)o(?=(?:(?!msgid ")[\s\S])*?msgstr)
Заменить
$1a
Смотрите тестовые примеры здесь
По сути, он сопоставляет o
s после просмотра msgid "
, после этого получает конец предыдущего совпадения, используя \G
, и продолжает сопоставлять остальные o
s, прежде чем встретить msgstr
.
Отлично!! Я протестировал это регулярное выражение, и оно работает во всех случаях, большое спасибо!!
Вы используете язык программирования здесь?