PCREsearch как пользоваться?
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3, 4  Next  :| |:
Total Commander -> Плагины Total Commander

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

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

Но в тестере выделяет все вместе с фразой "Адрес площадки:" и "Координаты:", хочется исключить эти фразы, чтоб только чистый адрес был. И еще плюс убрать лишние начальные пробелы из строки с адресом (если таковые будут).

#32:  Author: Skif_off PostPosted: Sat Feb 13, 2021 05:17
    —
Monarch-LFV
Как-то так
Code:
(?:\QАдрес площадки:\E)\s+([^\r\n]+?)\s+(?:\QКоординаты:\E)

?
В Replace String - $1

#33:  Author: Monarch-LFV PostPosted: Sat Feb 13, 2021 09:07
    —
Skif_off
Ваш код не работает, даже если с Replace String - $1 или $0. Тестер говорит "нет совпадений".
Но вы меня натолкнули на мысль и все получилось.
Code:
(\QАдрес площадки:\E.*\R\s*)((.*\R)+)(\QКоординаты:\E)

replace string - $2

#34:  Author: Skif_off PostPosted: Sat Feb 13, 2021 12:03
    —
Наверное, неудачно выбрал сайт для тестирования (или какие-то тонкости в реализации у плагина). Я не ошибся, в файлах используется 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.)

#35:  Author: Monarch-LFV PostPosted: Sat Feb 13, 2021 16:14
    —
Skif_off
Отчасти вы правы:
1. скобки групп первой и последней не нужны и тогда с $1 работает.
2. \R действительно не нужно, так как \s включает перенос строки (хотя в хелпе этого не нашел).
3. Отсутствие \s перед "\QКоординаты:\E" приводит к захвату переноса строк, но это не имеет значения, так как в конечном итоге все равно получаем одну строку в поле.
4. А вот в последнем вашем примере в группе только (.*), в хелпе сказано, что он не включает новую строку, соответвенно действует только до конца строки, поэтому в любом случае нужно ((.*\R)+).
В итоге получаем адаптированную рабочую регулярку:
Code:
\QАдрес площадки:\E.*\s*((.*\R)+)\QКоординаты:\E

PS. По поводу кодировок - это наверное было бы справедливо к тектовым файлам, к PDF это не применимо, по крайней мене, я даже не знаю как посмотреть кодировку PDF.

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


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

P.P.S. Не настаиваю, просто интересно и немного перфекционизма сверху Smile

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

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

Убрать бы ненужные пробелы, образующиеся при сносе строки и в конце (также при сносе).

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

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

Можно попробовать предложить автору подобную фичу, опционально, например, просто указать какой-то символ, а плагин сам прогонит замену Х+ на Х (хотя тут с метасимволами будут проблемы, если только их запретить).

#39:  Author: Monarch-LFV PostPosted: Sun Feb 14, 2021 15:00
    —
Skif_off
Почему-то ваша регулярка не работает в плагине. Скорее всего, из за того, что (?s) включает режим соотетствия точке и новое строке, то есть \n. А данный код почему-то не работает у меня с \n, только с \R.

#40:  Author: Skif_off PostPosted: Sun Feb 14, 2021 17:45
    —
Погонял немного плагин, действительно "(?s)" в начале почему-то ломает работу, но если добавить как "(?s).*", то срабатывает. Но потом вспомнил, что модификаторы вроде как можно применять/менять на ходу и добавил вот так:
Code:
\QАдрес площадки:\E\s*\K(?s)(.+?)\s*\QКоординаты:\E

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

P.S. Там ещё \K добавил, люблю эту штуку в PCRE, по идее должно ускорять работу, т.к. отбрасывает (не держит в памяти) все предыдущие совпадения - они ведь всё равно уже найдены.

#41:  Author: Monarch-LFV PostPosted: Sun Feb 14, 2021 18:16
    —
Skif_off
Да, супер, работает, как часы! Спасибо! последние 2 пробела в конце ушли, уже лучше, и заметно быстрее стал.
Остались пробелы на переводе строк, но это уже мелочи, которые видимо регуляркой не победить, так как в WDXGuide без них отображает, а в колонке TC с ними, и не поймешь чей косяк.

#42:  Author: Monarch-LFV PostPosted: Mon Mar 07, 2022 13:36
    —
Есть бинарные файлы *.dwg, из которых в принципе можно считать данные о пользователе. Но, данные файлы в кодировке UTF-16 LE (1200).
То есть, если открыть текстовым редактором например в кодировке UTF-8, то будет так:

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

По идее, должно быть что-то наподобие такого:
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 символов.

#43:  Author: Skif_off PostPosted: Mon Mar 07, 2022 15:55
    —
В документации плагина есть пункт "Unicode Input for Expressions", не смотрели?

В крайнем случае есть ещё WinScript Advanced, а в том же VBScript - способы указать кодировку (см. объект FileSystemObject) + InStr.

#44:  Author: Monarch-LFV PostPosted: Tue Mar 08, 2022 05:15
    —
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 изучить.

#45:  Author: Skif_off PostPosted: Tue Mar 08, 2022 20:42
    —
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)



Total Commander -> Плагины Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3, 4  Next  :| |:
Page 3 of 4

Powered by phpBB © 2001, 2005 phpBB Group