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, 4  Next
 
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: 225

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: 1232

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: 225

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: 1232

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: 225

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: 1232

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: 225

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: 1232

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: 225

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: 1232

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: 225

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
Monarch-LFV



Joined: 22 Jul 2019
Posts: 225

Post (Separately) Posted: Mon Mar 07, 2022 13:36    Post subject: Reply with quote

Есть бинарные файлы *.dwg, из которых в принципе можно считать данные о пользователе. Но, данные файлы в кодировке UTF-16 LE (1200).
То есть, если открыть текстовым редактором например в кодировке UTF-8, то будет так:
    < s t r i n g > e v g e n i y . f a m i l y < / s t r i n g >

Причем, пробелы там, это по сути не пробелы "\020", а символы NUL - "\000".
Вопрос, как дать понять плагину, что файл в UTF-16? Чтобы понимал двухбайтовые символы в таком виде:
    <string>evgeniy.family</string>

По идее, должно быть что-то наподобие такого:
Code:
regex10=\<string\>(.*?)\<\/string\>


Пока выхожу из положения так:
Code:
regex10=\<.s.t.r.i.n.g.\>.(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.)
regex10replace=$1$2$3$4$5$6$7$8$9$10$11$12$13$14$15$16$17$18$19$20

Но не очень красиво получается, просто выборка 20 символов.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Mon Mar 07, 2022 15:55    Post subject: Reply with quote

В документации плагина есть пункт "Unicode Input for Expressions", не смотрели?

В крайнем случае есть ещё WinScript Advanced, а в том же VBScript - способы указать кодировку (см. объект FileSystemObject) + InStr.
Back to top
View user's profile Send private message
Monarch-LFV



Joined: 22 Jul 2019
Posts: 225

Post (Separately) Posted: Tue Mar 08, 2022 05:15    Post subject: Reply with quote

Skif_off
Справку по "Unicode Input for Expressions" смотрел, но как не пробовал, как не крутил, все равно ничего не получается почему-то. Причем если просто текстовый файл создать в кодировке 1200, то его получается считать, а вот если бинарный dwg, то нет. Видимо, не только с кодировкой проблемы, а связано с другими символами, которые определяют файл бинарным.
Сделал тестовый файл: https://cloud.mail.ru/public/6xC8/ckPfmp9HD
Так вот, если во второй строке удалить пробельный символ (это не пробел) между "> <", то плагин работает, а так - нет.
Code:
regex10=(*UTF)\x{03C}\x{073}\x{074}\x{072}\x{069}\x{06E}\x{067}\x{03E}(.*?)\x{03C}
regex10replace=$1

Также не совсем понял по поводу рекомендованной в справке (*UTF). Что с ней, что без нее - результат одинаковый.
По поводу WinScript Advanced - скорее всего будет тот же результат, но вначале нужно еще будет VBScript изучить.
Back to top
View user's profile Send private message
Skif_off



Joined: 28 Nov 2012
Posts: 1232

Post (Separately) Posted: Tue Mar 08, 2022 20:42    Post subject: Reply with quote

Monarch-LFV
UTF-16 LE, но без BOM - поэтому и спотыкается, наверное.
Попробуйте в hex-редакторе дописать в начало FFFE (т.е. два байта), если плаг заработает, то дело в отсутствии BOM (просто по этой метке обычно детектят UTF-16/32). Ну или в исходниках посмотрите, как плаг открывает файлы.
Если так, то, возможно, проще написать автору. Только, если что, просите флаг какой-нибудь принудительный, типа "(*UTF16)" Smile, не надо нагромождать постоянную проверку кодировки.
Monarch-LFV wrote:
По поводу WinScript Advanced - скорее всего будет тот же результат

Не факт, попадались скрипты для правки бинарников.

Отрежте кусок в hex-редакторе со всеми нужными текстовыми данными (какой у них объём обычно или максимум по спецификации, если есть?) и покажите, что оттуда надо вытащить.

P.S. Может, Гислера уболтать поддержку Lua запилить? Smile Пока логинился, смотрел файл, писал ответ, перечитывал на предмет ошибок - для DC уже бы, наверное, дописывал плаг Smile)
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, 4  Next
Page 3 of 4

 
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