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 

PCREsearch как пользоваться?
Goto page Previous  1, 2, 3
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 58

Post (Separately) Posted: Sat Feb 13, 2021 03:02    Post subject: Reply with quote

Skif_off
Спасибо, но все также не работает, также включает первую строку.
Вообще постановка задачи следующая:
Имеется много PDF файлов (поэтому плагин Text Line не подойдет) по определенной форме:
Code:
Арендодатель:
Имя Арендодателя
Адрес площадки:
   Субъект РФ, г. Такой-то, ул. Такая-то, 500 м севернее дома №5, объект АО "Фирма"
Координаты:
дд,ддддд ш,шшшшш

Нужно в поле выдернуть адрес, при этом, адрес может быть написан в одну или несколько строк, то есть критерий выбора должен быть от фразы "Адрес площадки:" и до фразы "Координаты:", без включения оных.
Попробовал написать регулярку такую:
Code:
(?:\QАдрес площадки:\E.*\R)(.*\R)+(?:\QКоординаты:\E)

Но в тестере выделяет все вместе с фразой "Адрес площадки:" и "Координаты:", хочется исключить эти фразы, чтоб только чистый адрес был. И еще плюс убрать лишние начальные пробелы из строки с адресом (если таковые будут).
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1201

Post (Separately) Posted: Sat Feb 13, 2021 05:17    Post subject: Reply with quote

Monarch-LFV
Как-то так
Code:
(?:\QАдрес площадки:\E)\s+([^\r\n]+?)\s+(?:\QКоординаты:\E)

?
В Replace String - $1
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 58

Post (Separately) Posted: Sat Feb 13, 2021 09:07    Post subject: Reply with quote

Skif_off
Ваш код не работает, даже если с Replace String - $1 или $0. Тестер говорит "нет совпадений".
Но вы меня натолкнули на мысль и все получилось.
Code:
(\QАдрес площадки:\E.*\R\s*)((.*\R)+)(\QКоординаты:\E)

replace string - $2
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1201

Post (Separately) Posted: Sat Feb 13, 2021 12:03    Post subject: Reply with quote

Наверное, неудачно выбрал сайт для тестирования (или какие-то тонкости в реализации у плагина). Я не ошибся, в файлах используется UTF-8, а не UTF-16?

Прошу прощения за любопытство, если вы решили избавится от (?:шаблон), то какой смысл использовать обычные группы? Так
Code:
\QАдрес площадки:\E.*\R\s*((.*\R)+)\QКоординаты:\E

с $1 не работает?
\R точно необходима, \s не достаточно?
Если правильно понял, отсутствие \s перед "\QКоординаты:\E" приводит к захвату переноса строк в конце адреса.

Добавлено спустя 59 минут:

По идее \s включает в себя не только пробел и табуляцию, но и \r с \n - нет смысла добавлять и \R, проверил в плагине
Code:
\QАдрес площадки:\E\s*(.*)\s*\QКоординаты:\E

с Field type=String Output и Replace string=$1, вроде работает.
(Для теста накидал текстовые файлы в Win-1251 и UTF-8, с \n и \r\n.)
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 58

Post (Separately) Posted: Sat Feb 13, 2021 16:14    Post subject: Reply with quote

Skif_off
Отчасти вы правы:
1. скобки групп первой и последней не нужны и тогда с $1 работает.
2. \R действительно не нужно, так как \s включает перенос строки (хотя в хелпе этого не нашел).
3. Отсутствие \s перед "\QКоординаты:\E" приводит к захвату переноса строк, но это не имеет значения, так как в конечном итоге все равно получаем одну строку в поле.
4. А вот в последнем вашем примере в группе только (.*), в хелпе сказано, что он не включает новую строку, соответвенно действует только до конца строки, поэтому в любом случае нужно ((.*\R)+).
В итоге получаем адаптированную рабочую регулярку:
Code:
\QАдрес площадки:\E.*\s*((.*\R)+)\QКоординаты:\E

PS. По поводу кодировок - это наверное было бы справедливо к тектовым файлам, к PDF это не применимо, по крайней мене, я даже не знаю как посмотреть кодировку PDF.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1201

Post (Separately) Posted: Sat Feb 13, 2021 17:04    Post subject: Reply with quote

2. В хелпе с плагином упомянут "пробельный символ", но это синтаксис PCRE, более подробное описание найти в сети не проблема.
3. Это не вылезет боком, например, при копировании содержимого всех колонок, в подсказке или при использовании поля иным способом?
4. Ориентировался на ваш пример выше.Тогда логичнее "([.\n]+)" и ".*\s*" перед группой выглядит непонятно, т.е. в итоге:
Code:
\QАдрес площадки:\E\s*([.\n]+)\s*\QКоординаты:\E


P.S. Вы потрошите PDF как текст, значит, какая-то кодировка для текста там есть, можно открыть в текстовом редакторе и посмотреть. В принципе, плагин работает и с ANSI, и с UTF-8, значит, можно не парится.

P.P.S. Не настаиваю, просто интересно и немного перфекционизма сверху Smile
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 58

Post (Separately) Posted: Sun Feb 14, 2021 05:22    Post subject: Reply with quote

Skif_off
3. Конструкция группы подразумевает, что в конце группы будет в любом случае снос строки.
4.1. Конструкция "([.\n]+)" отказывается работать, из-за точки внутри кавдратных скобок, нашел в интернете, что такое недопустимо. Хотя вполне логично было бы.
4.2. А вот ".*" перед группой действительно не нужно, просто остался как атавизм с прошлой версии регулярки, убрал.
Единственное, что осталось раздражать, это при сносе строки идет замена на два пробела, причем это видно, если вытянуть поле в пользовательские колонки TC (при использовании WDXGuide двойные пробелы отсутствуют), то есть:
Code:
Субъект РФ, г. Такой-то, ул. Такая-то, 500 м севернее дома  №5, объект АО __"Фирма"__

(Слово "Фирма" было на второй строке в PDF. Двойные пробелы заменил подчеркиванием для видимости.)
Пока такой код:
Code:
\QАдрес площадки:\E\s*((.*\R)+)\QКоординаты:\E

Убрать бы ненужные пробелы, образующиеся при сносе строки и в конце (также при сносе).
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1201

Post (Separately) Posted: Sun Feb 14, 2021 09:37    Post subject: Reply with quote

3. В таком виде получается, что выражение должно вернуть группу из одной и более групп "(.*\R)". Оно срабатывает тут, конечно, но громоздко и больше ресурсов.
4.1. Спасибо, запомню (в таких конструкциях, когда точно известно начало и конец и внутри могут быть \r и \n обычно использую ".*?").
Пока писал, внезапно вспомнил про модификаторы, тогда как-то так можно
Code:
(?s)\QАдрес площадки:\E\s*(.*+)\QКоординаты:\E

(если от конечных пробельных символов не избавляться).

Можно попробовать предложить автору подобную фичу, опционально, например, просто указать какой-то символ, а плагин сам прогонит замену Х+ на Х (хотя тут с метасимволами будут проблемы, если только их запретить).
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 58

Post (Separately) Posted: Sun Feb 14, 2021 15:00    Post subject: Reply with quote

Skif_off
Почему-то ваша регулярка не работает в плагине. Скорее всего, из за того, что (?s) включает режим соотетствия точке и новое строке, то есть \n. А данный код почему-то не работает у меня с \n, только с \R.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1201

Post (Separately) Posted: Sun Feb 14, 2021 17:45    Post subject: Reply with quote

Погонял немного плагин, действительно "(?s)" в начале почему-то ломает работу, но если добавить как "(?s).*", то срабатывает. Но потом вспомнил, что модификаторы вроде как можно применять/менять на ходу и добавил вот так:
Code:
\QАдрес площадки:\E\s*\K(?s)(.+?)\s*\QКоординаты:\E

И заработало Smile

P.S. Там ещё \K добавил, люблю эту штуку в PCRE, по идее должно ускорять работу, т.к. отбрасывает (не держит в памяти) все предыдущие совпадения - они ведь всё равно уже найдены.
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 58

Post (Separately) Posted: Sun Feb 14, 2021 18:16    Post subject: Reply with quote

Skif_off
Да, супер, работает, как часы! Спасибо! последние 2 пробела в конце ушли, уже лучше, и заметно быстрее стал.
Остались пробелы на переводе строк, но это уже мелочи, которые видимо регуляркой не победить, так как в WDXGuide без них отображает, а в колонке TC с ними, и не поймешь чей косяк.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3
Page 3 of 3

 
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