Поиск и замена текста с кавычками через регулярные выражения

Обсуждение программы nhrt - замена текста в файлах (прежнее название nhrplc)
bursoft
Сообщения: 8
Зарегистрирован: 20 фев 2017, 10:02

Поиск и замена текста с кавычками через регулярные выражения

Сообщение bursoft »

Здравствуйте

Программа nhrplc очень зачетная, использую ее в составе своей утилиты Batch Apktool http://4pda.ru/forum/index.php?showtopic=557858
Назрел один вопрос, сам не могу разобраться, прошу помощи.

Есть строка в файле xml:

Код: Выделить всё

<com.google.android.gms.ads.NativeExpressAdView android:layout_gravity="center" android:id="@id/adView" android:layout_width="wrap_content" android:layout_height="wrap_content" ads:adSize="FULL_WIDTHx80" ads:adUnitId="@string/admob_native_publisher_id" xmlns:ads="http://schemas.android.com/apk/res-auto" />
Хочу заменить ее при помощи регулярного выражения при помощи списка замен из файла res.txt:

Код: Выделить всё

-sre:(<\S*[^<]*)(android:id=\"@id/(?:[Aa][Dd][Ss]|[Bb][Aa][Nn][Nn][Ee][Rr]|[Aa][Dd][Vv][Ii][Ee][Ww]|[Aa][Dd][Vv][Ii][Ee][Ww]Layout)\")[^<]*(\"\s?/?>) -ft:$1$2 android:layout_width="0.0dip" android:layout_height="0.0dip" android:visibility="gone$3
Использую командную строку

Код: Выделить всё

nhrplc -list:res.txt -notitle -o:d *.xml
nhrplc не может найти соответствий этому регулярному выражению. ок, я не очень знаком с отличиями синтаксиса TR1 Regular Expressions от Python, начинаю разбираться, и тут вылезает проблема. начинаю редактировать регулярное выражение поиска, и получаю ошибки о неправильном запросе в заменяемой строке.

Код: Выделить всё

Такой запрос не поддерживается. android:layout_width="0.0dip" android:layout_height="0.0dip" android:visi
bility="gone$3 (Такой запрос не поддерживается.)
У меня появилось ощущение, что это из-за интерпретации кавычек, и я не могу понять, как правильно их использовать и в каких случаях экранировать.

Подскажите, что я неправильно делаю. Я попробовал сделать такую же замену через rxrepl https://sites.google.com/site/regexreplace/, все сразу получилось, но хотелось бы сделать это в вашей программе, она лучше)

В rxrepl, в случае замены через список в файле, можно использовать любой символ для обрамления поисковой и заменяемой строк
You can provide search and replace options via an options file.
This allows you bypass the restrictions of the command line parser.

The search and replace text may be delimited in various ways:

--search(sample text) -s[sample text] -s<sample text> -s{sample text}
--replace|sample text| -r#sample text# -r~sample text~ -r:sample text:
--search?sample text? (where ? can be any printable character)
Если в этом проблема, то, может, и в nhrplc можно сделать подобным образом, для обходя ограничений парсера командной строки?

Спасибо)

nhutils
Сообщения: 582
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение nhutils »

Здравствуйте! Спасибо за хороший вопрос и подробную информацию.
В -sre работает экранирование кавычек \", то есть можно написать так:

Код: Выделить всё

-sre:"text\"text\"text"
В -ft возможности экранирования на данный момент нет.
Предложение правильное, ставим в план. По итогу напишу здесь.

bursoft
Сообщения: 8
Зарегистрирован: 20 фев 2017, 10:02

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение bursoft »

Спасибо за ответ, буду ждать новостей)

Почему вообще у меня появилось непонимание кавычек.
Есть строка:

Код: Выделить всё

const-string v2, ".doubleclick.net"
Хочу ее заменить через файл замены smali.txt

Код: Выделить всё

-sre:\".*doubleclick\.net.*\" -et:\"=\"
все заменяется нормально. но если заключить регулярное выражение поиска в кавычки, которые, как я понимаю, просто обрамляют запрос и не должны влиять на результат поиска

Код: Выделить всё

-sre:"\".*doubleclick\.net.*\"" -et:\"=\"
то замены не происходит! это связано с особенностями TR1 Regular Expressions, или я что-то неправильно делаю?
и еще, кстати, можно ли где-то найти онлайн тестер для этого TR1 Regular Expressions, наподобие https://regex101.com/?
спасибо)

nhutils
Сообщения: 582
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение nhutils »

bursoft писал(а):но если заключить регулярное выражение поиска в кавычки, которые, как я понимаю, просто обрамляют запрос и не должны влиять на результат поиска

Код: Выделить всё

-sre:"\".*doubleclick\.net.*\"" -et:\"=\"
то замены не происходит!
Да, конечно, то, что они нарушают поиск, это ошибка в программе, в ближайшее время поправим.
bursoft писал(а): и еще, кстати, можно ли где-то найти онлайн тестер для этого TR1 Regular Expressions, наподобие https://regex101.com/?
спасибо)
Тоже искал, но не смог найти. Есть идея сделать offline тестер на основе той же библиотеки и прикладывать к программе.

bursoft
Сообщения: 8
Зарегистрирован: 20 фев 2017, 10:02

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение bursoft »

nhutils писал(а):Да, конечно, то, что они нарушают поиск, это ошибка в программе, в ближайшее время поправим.
о, спасибо, а то я всю голову сломал)
nhutils писал(а):Есть идея сделать offline тестер на основе той же библиотеки и прикладывать к программе.
да, было бы здорово. мне, как не очень искушенному пользователю, достаточно сложно понять, где ошибка: в моем регулярном выражении, в программе, или в том, что не учел особенности парсера командной строки.
тестер бы помог решить все эти проблемы.

nhutils
Сообщения: 582
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение nhutils »

Добрый день!
bursoft писал(а):если заключить регулярное выражение поиска в кавычки, которые, как я понимаю, просто обрамляют запрос и не должны влиять на результат поиска

Код: Выделить всё

-sre:"\".*doubleclick\.net.*\"" -et:\"=\"
то замены не происходит!
Исправлена работа параметров -sre и -ft, теперь они поддерживают кавычки внутри строки обозначением как \".
v2.9.0.9

bursoft
Сообщения: 8
Зарегистрирован: 20 фев 2017, 10:02

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение bursoft »

nhutils писал(а):Добрый день!
Исправлена работа параметров -sre и -ft, теперь они поддерживают кавычки внутри строки обозначением как \".
v2.9.0.9
спасибо, буду тестировать новую версию!

есть еще вопрос, снова про кавычки)
есть строка

Код: Выделить всё

const-string v2, ".double click.net"
хочу заменить через список замен в файле. если обрамляю регулярку поиска в кавычки

Код: Выделить всё

-sre:"\".*double click\.net.*\"" -et:""=""
, то получаю ошибку
Такой запрос не поддерживается. click\.net.*\"" -et:""="" (Такой запрос не поддерживается.)
если без кавычек

Код: Выделить всё

-sre:\".*double click\.net.*\" -et:""=""
, то замена происходит нормально

ок, пробую дальше на запросе без кавычек. если заменяю на -et:""="", то в результате получаю строку

Код: Выделить всё

const-string v2, ""=""
если же заменяю через -et:"=", то на выходе получаю

Код: Выделить всё

const-string v2, =
это правильное поведение, или я не до конца разобрался?

спасибо!

nhutils
Сообщения: 582
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение nhutils »

Спасибо за подробные комментарии!
Были ошибки в -sre при наличии и пробелов, и кавычек.
Выкладываю обновленную версию nhrt-v2.9.0.10-binaries.zip
Рабочие варианты c sre и t/et:

Код: Выделить всё

-sre:"\".*double click\.net.*\"" -et:"\"=\""
-sre:"\".*double click\.net.*\"" -t:""=""
Буду ещё дополнять документацию.

Спасибо!

bursoft
Сообщения: 8
Зарегистрирован: 20 фев 2017, 10:02

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение bursoft »

nhutils писал(а):Спасибо за подробные комментарии!
Были ошибки в -sre при наличии и пробелов, и кавычек.
Выкладываю обновленную версию nhrt-v2.9.0.10-binaries.zip
Буду ещё дополнять документацию.

Спасибо!
вам спасибо! пробую обновленную версию!
отдельное спасибо за обновление документации. было бы очень удобно всю документацию собрать в одном месте, а также актуализировать чейнджлог.
а то сейчас на http://nhutils.ru/blog/ ссылка на nhreplace ведет к записи http://nhutils.ru/blog/nhreplace-v2-4/ со старой версией 2.4
страница версий http://nhutils.ru/blog/nhrt/versions/ указывает, что последняя версия - 2.6. если прочитать страницу внимательнее, то можно понять, что информация о более новых версиях опубликована в виде постов, но по ссылке последняя версия - 2.8.1
по ссылке http://nhutils.ru/blog/nhrt/download/ можно скачать крайнюю версию, но описание нововведений в этой версии можно найти, только посмотрев пост в "Свежих записях" http://nhutils.ru/blog/nhrt-v2-9-0/
также, на странице справки http://nhutils.ru/blog/nhrt/help/ нет описания новых ключей и кодировок
а на странице http://nhutils.ru/blog/nhrt/ ссылка "Справка nhreplace" ведет на страницу справки по nhsms

ок, продолжаю экспериментировать
меняю уже знакомую вам строку

Код: Выделить всё

const-string v2, ".double click.net"
через регулярное выражение

Код: Выделить всё

-sre:"(\".*double click\.net.*\")" -ft:"0.0dip\" "
получаю ошибку
Такой запрос не поддерживается. " (Такой запрос не поддерживается.)
спасибо!

nhutils
Сообщения: 582
Зарегистрирован: 09 дек 2009, 18:08
Контактная информация:

Re: Поиск и замена текста с кавычками через регулярные выражения

Сообщение nhutils »

bursoft писал(а):было бы очень удобно всю документацию собрать в одном месте, а также актуализировать чейнджлог.
Обновление в процессе, в ближайшие дни большинство вопросов будет снято.
bursoft писал(а): меняю уже знакомую вам строку

Код: Выделить всё

const-string v2, ".double click.net"
через регулярное выражение

Код: Выделить всё

-sre:"(\".*double click\.net.*\")" -ft:"0.0dip\" "
получаю ошибку
Такой запрос не поддерживается. " (Такой запрос не поддерживается.)
Если заменяемый текст статический, то больше подходят параметры -t (-text) или -et (-escapetext). И поскольку внутри замещающего текста есть кавычки с соседствующими пробелами, то остаётся только использовать -et (-escapetext):

Код: Выделить всё

nhrt -sre:"(\".*double click\.net.*\")" -et:"0.0dip\" " -cp:utf-8_bom -o:d -notitle C0248_t11.txt
C0248_t11.txt UTF-8_BOM : 1
Или через замены по списку C0248_t3list.txt:

Код: Выделить всё

-sre:"(\".*double click\.net.*\")" -et:"0.0dip\" "
Выполнение:

Код: Выделить всё

nhrt -list:C0248_t3list.txt -cp:utf-8_bom -o:d -notitle C0248_t11.txt
C0248_t11.txt UTF-8_BOM : 1

Закрыто