Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Примеры регулярных выражений

 
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение printer-friendly view
View previous topic :: View next topic  
Author Message
Batya



Joined: 15 Dec 2004
Posts: 2231
Location: Москва, Россия

Post (Separately) Posted: Thu Jul 16, 2026 19:41    Post subject: Примеры регулярных выражений Reply with quote

Комрады, прошу помощи. Что-то мозг закипает.
Есть текст вида
Quote:
_|_123_|_124_|_125_|_123_|_126_|_127
_|_123_|_128_|_129

Задача - если в тексте встречается такой же текст, как в начале строки по шаблону "^(_\|_\d+_\|)", заменить на перенос строки такой текст в любом месте строки. Т. е. применительно к указанному примеру заменять нужно исключительно "_|_123_|", и должно получиться:
Quote:

_124_|_125
_126_|_127

_128_|_129

Заранее число, стоящее в начале строки неизвестно. Но заменять надо только блоки, содержащие число из начала строки.
Соответственно, аналогичный результат должен получиться и, например, для текста:
Quote:
_|_78_|_124_|_125_|_78_|_126_|_127
_|_78_|_128_|_129

Если принципиально, использую поиск в Notepad++.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1211

Post (Separately) Posted: Fri Jul 17, 2026 12:47    Post subject: Reply with quote

Batya wrote:
Что-то мозг закипает

Мозг действительно закипает Smile
Batya wrote:
Если принципиально, использую

А принципально использовать регулярные выражения? Может быть, для данной задачи лучше использовать скрипт?

Я сам никогда не пользовался, но есть, вроде, такие продвинутые вещи, как проверки и заглядывания вперед и назад (assertions: lookahead, lookahead), может быть, они подойдут для решения этой задачи?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2231
Location: Москва, Россия

Post (Separately) Posted: Fri Jul 17, 2026 13:08    Post subject: Reply with quote

На работе используется Notepad++. Необходимо оперативно по определённым правилам менять текст в несохранённом документе. Для этого хочу записать Notepad++-макрос. Вот для записи макроса и пытаюсь правильно составить регулярное выражение поиска и замены.
Ключевые моменты - текст, как я говорил, не сохранён в виде файла; буфер обмена при использовании макроса трогать крайне нежелательно.
Ну и для себя пытаюсь разобраться в ранее неосвоенных тонкостях регулярных выражений.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1211

Post (Separately) Posted: Fri Jul 17, 2026 13:26    Post subject: Reply with quote

Batya
Я понял.

Почему бы не подключить к этому делу ИИ? Он меня уже не раз выручал. Главное держать его в узде вопросы правильные к нему формулировать Very Happy
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 341
Location: Электросталь

Post (Separately) Posted: Fri Jul 17, 2026 20:16    Post subject: Reply with quote

Batya

Обновлено: Прошу прощения, не вчитался! Корректный ответ ниже.

Сейчас нет возможности опробовать (Notepad++ не пользуюсь), но судя по справке должно работать вот это:
Code:
Найти:
(?m-s)^(_\|_\d+_\|)(.+?\r\n)\1
Заменить:
\2

Если в файле окончания строк LF, тогда в поиске \r\n заменить на \n.
Попробуйте, пожалуйста, если не сработает, то скачаю портабельный Notepad++, погоняю.
_________________
Amo ergo sum


Last edited by yozhik on Sat Jul 18, 2026 15:29; edited 1 time in total
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1211

Post (Separately) Posted: Sat Jul 18, 2026 00:42    Post subject: Reply with quote

yozhik
А где пояснения в стиле ИИ? Very Happy

Кстати, он мне говорит, что за одну итерацию невозможно заменить все \1. Только программным путем Confused
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 341
Location: Электросталь

Post (Separately) Posted: Sat Jul 18, 2026 04:20    Post subject: Reply with quote

Orion9 wrote:
А где пояснения в стиле ИИ?

Это для молодых. Бате не надо, он насквозь видит.
Orion9 wrote:
он мне говорит, что за одну итерацию невозможно заменить все \1.

Это он так денег просит. Культурно намекает.

Регулярка то рабочая, в EditPad Pro исправно отрабатывает:


Но каждый редактор надо отдельно проверять. В AkelPad, например, backreferenc'ы в строке поиска не всегда срабатывают.
_________________
Amo ergo sum
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1211

Post (Separately) Posted: Sat Jul 18, 2026 11:59    Post subject: Reply with quote

yozhik wrote:
Это для молодых. Бате не надо, он насквозь видит.

Не беда. Как вы знаете, болвана ИИ всегда можно рубануть в лоб прямым вопросом:

 Hidden text

yozhik wrote:
Это он так денег просит. Культурно намекает.

Laughing

Да нет. Видимо, это я неправильно задачу понял. Я думал, что нужно искать и заменять в каждой строке отдельно, т.е. если есть текст из трех строк:
Code:
_|_78_|_124_|_125_|_78_|_126_|_127
_|_78_|_128_|_129
_|_122_|_123_|_124_|_122_|_127_|_128

То буду заменены только строки 1 и 3, т.к. они содержат блоки с которого они начинаются. А если нужно заменить во всем тексте блоки с которого начинается этот текст, то не понимаю, зачем вообще регулярные выражения. Можно просто выделить начало текста и заменить. Или там сотни замен нужно делать каждый день?
Back to top
View user's profile Send private message
yozhik



Joined: 04 May 2014
Posts: 341
Location: Электросталь

Post (Separately) Posted: Sat Jul 18, 2026 15:26    Post subject: Reply with quote

Orion9 wrote:
Видимо, это я неправильно задачу понял.

Нет, это я её неправильно понял, точнее поторопился и просто не вчитался.

Ограничение регулярок в том, что для замены нужно знать точное кол-во совпадений. Т.е. я могу найти неопределённое число совпадений, но если мне нужно каждое из них заменить, то в замене я должен сослаться на каждое совпадение по его номеру, иначе никак.

Поэтому к Бате вопрос: этот шаблон стабильный или варьируется?

Code:
_|_123_|_124_|_125_|_123_|_126_|_127
_|_123_|_128_|_129

другими словами

(искомое) ... (искомое) ...
(искомое) ...


Т.е. «искомое» всегда ли 2жды в первой строке и 1жды во второй? Если да, то поможет вот это:

Code:
Найти:
(?m-s)^(_\|_\d+_\|)(.+?)\1(.+?\r\n)\1
Заменить:
\r\n\2\r\n\3\r\n


Если нет, то решение — перечислить в макросе по очереди все возможные варианты. Например:

Code:
Для:
(искомое) ... (искомое) ... (искомое) ...
(искомое) ... (искомое) ...

Найти/Заменить:
(?m-s)^(_\|_\d+_\|)(.+?)\1(.+?)\1(.+?\r\n)\1(.+?)\1
\r\n\2\r\n\3\r\n\4\r\n\5\r\n

Для:
(искомое) ... (искомое) ... (искомое) ...
(искомое) ...

Найти/Заменить:
(?m-s)^(_\|_\d+_\|)(.+?)\1(.+?)\1(.+?\r\n)\1
\r\n\2\r\n\3\r\n\4\r\n

Для:
(искомое) ... (искомое) ...
(искомое) ...

Найти/Заменить:
(?m-s)^(_\|_\d+_\|)(.+?)\1(.+?\r\n)\1
\r\n\2\r\n\3\r\n

Для:
(искомое) ...
(искомое) ...

Найти/Заменить:
(?m-s)^(_\|_\d+_\|)(.+?\r\n)\1
\r\n\2\r\n

и т.п.


Ну, или скрипт писать, да, программно.
_________________
Amo ergo sum
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Программное обеспечение All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group