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 

Примеры регулярных выражений
Goto page 1, 2  Next
 
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: 2235
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: 1220

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: 2235
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: 1220

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: 347
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: 1220

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: 347
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: 1220

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: 347
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
Orion9



Joined: 01 Jan 2024
Posts: 1220

Post (Separately) Posted: Sun Jul 19, 2026 11:59    Post subject: Reply with quote

yozhik wrote:
Поэтому к Бате вопрос:

Согласен, нужно уточнить задачу. Но раз уж Batya озаглавил тему так, что можно делиться собственным неудачным (или удачным?) опытом, то помню, когда сталкнулся в справке с такими примерами:
Code:
RegEx  Находит 
foob.*r      foobar, foobalkjdflkj9r и foobr 
foob.+r      foobar, foobalkjdflkj9r, но не foobr 
foob.?r      foobar, foobbr и foobr, но не foobalkj9r 
fooba{2}r    foobaar 
fooba{2}r `  foobaar, foobaaar, foobaaaar` и т. д. 
fooba{2,3}r  foobaar, или foobaaar, но не foobaaaar 
(foobar){8,10} 8, 9 или 10 экземпляров foobar (() это Группа)

Очень мне не понравился этот fooba{2}r `. Хотелось бы услышать пояснений, но не догадался тогда у болвана спросить Very Happy

 почему находит foobaar, foobaaar, foobaaaar`
Back to top
View user's profile Send private message
yozhik



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

Post (Separately) Posted: Sun Jul 19, 2026 12:39    Post subject: Reply with quote

Orion9 wrote:
fooba{2}r `

Ох, так ведь это ж очепятка Smile У Сорокина такое встречается, к сожалению. Надо смотреть исходники, и в них сразу видны сбои автоматики:
https://github.com/andgineer/TRegExpr/blob/master/docs/src/ru/regular_expressions.md?plain=1#L332

Здесь должно было быть fooba{2,}r . Запятая после двойки у Сорокина потерялась, но сохранилась, например, здесь и здесь (поиск на странице по слову "foobalkjdflkj9r", так быстрее).

болван wrote:
Однако в вашем шаблоне дальше идёт буква r, а не a. Движок спотыкается. ...
Он берёт вторую и третью буквы «а» как выполнение условия a{2}, а за ними как раз идёт нужная буква r .

А болван то юморист! Хорошо насмешил. Занимательные такие антропоморфизмы. И большой плюс болвана в том, что когда вокруг смеются, ему не обидно Smile
_________________
Amo ergo sum
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1220

Post (Separately) Posted: Sun Jul 19, 2026 14:14    Post subject: Reply with quote

yozhik wrote:
Ох, так ведь это ж очепятка

Shocked

У него-то, может, опечатка. А меня картина мира перевернулась. Две ночи не мог уснуть, всё думал над дилеммой.

yozhik wrote:
У Сорокина такое встречается, к сожалению. Надо смотреть исходники, и в них сразу видны сбои автоматики:

Смотреть исходники - это последнее, что бы мне пришло в голову Laughing
yozhik wrote:
А болван то юморист!

Не только. Он еще и друг человека... И человек - бовану друг Very Happy
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1220

Post (Separately) Posted: Mon Jul 20, 2026 00:34    Post subject: Reply with quote

yozhik
Чуть не забыл сказать спасибо за разъяснение по опечатке Smile

А болван, да — радует своим креативом. Недавно задавался смежным вопросом, так почему бы его еще не помучать?

 Hidden text
Back to top
View user's profile Send private message
Batya



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

Post (Separately) Posted: Mon Jul 20, 2026 12:28    Post subject: Reply with quote

Спасибо за ответы!
Quote:
Найти:
(?m-s)^(_\|_\d+_\|)(.+?\r\n)\1
Заменить:
\2

К сожалению, не то Sad
Quote:
этот шаблон стабильный или варьируется?

Шаблон варьируется.
Постараюсь описать в более широком смысле...
Есть некоторое приложение, которое формирует логи работы. При этом часть логируемых данных записывается в некотором табличном виде. Суть задачи - скопировать из большого лога часть текста, описывающего таблицу, и не сохраняя в отдельный файл в Notepad++ макросом преобразовать этот текст таким образом, чтобы его потом скопировать и вставить в Excel уже в виде нормальной таблицы.
В исходном логе строки таблицы могут быть на отдельных строках, а могут быть склеены. Ключевая особенность в том, что начало табличного текста и начало каждой строки начинается с одинакового фрагмента, который меняется для каждого лога. Количество строк всегда разное. Количество склеенных строк (с удалённым переносом строк) заранее не известно. Проблема именно в том, что иногда случайны образом переносы строк удалены, и строки склеены.
Примеры:
Code:
_|_78_|_чило124_|_текст125_|_78_|_текст126_|_число127
_|_78_|_ля-ля-ля128_|_129
_|_78_|_123_|_124_|_78_|_127_|_128

Code:
_|_78_|_чило124_|_текст125
_|_78_|_текст126_|_число127
_|_78_|_ля-ля-ля128_|_129
_|_78_|_123_|_124_|_78_|_127_|_128

Code:
_|_78_|_чило124_|_текст125_|_78_|_текст126_|_число127_|_78_|_ля-ля-ля128_|_129_|_78_|_123_|_124_|_78_|_127_|_128

Сам по себе начальный фрагмент полезной информации не несёт. Его можно заменить, а можно и оставить. В итоге хочу, чтобы получилось так:
Code:
чило124_|_текст125
текст126_|_число127
ля-ля-ля128_|_129
123_|_124
127_|_128

или так
Code:
_|_78_|_чило124_|_текст125
_|_78_|_текст126_|_число127
_|_78_|_ля-ля-ля128_|_129
_|_78_|_123_|_124
_|_78_|_127_|_128

После замены убрать лишние пустые строки - не проблема. Возможное попадание хороших данных в совпадение с начальным фрагментом и замена их на перенос строки - не страшно.
Думаю, что задачу можно решить макросом на vba для вставки в Excel, но хотелось именно решить через регулярные выражения - давно мечтал их полностью освоить.
_________________
Нет, я не сплю. Я просто медленно моргаю.


Last edited by Batya on Mon Jul 20, 2026 13:16; edited 1 time in total
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 1220

Post (Separately) Posted: Mon Jul 20, 2026 13:00    Post subject: Reply with quote

Batya
Как я и говорил, тут регэкспресы особо не нужны. Можно просто тройной заменой обойтись. Сначала заменить _|_78_| на \n. Потом \n_ на \n. Потом \n\n на \n. Результат будет ровно, как вы хотите.
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
Goto page 1, 2  Next
Page 1 of 2

 
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