Регулярные выражения

Russian main discussion
  • Author
  • Message
YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

VladSh wrote:YuS
TextReplace не подходит - надо работать с программно полученным текстом.
Да, кстати, почему не подходит? В чем там принципиальное отличие текста?

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

yozhic, YuS
Спасибо за помощь и пояснения! Теперь понятно :)
YuS wrote:Да, кстати, почему не подходит? В чем там принципиальное отличие текста?
В TextReplace отсутствует параметр чтобы передать текст. Т.е. этот метод сам получает данные из окна редактирования AkelPad. Регулярки хороши тем, что они работают с произвольным текстом, который может быть предварительно программно обработан.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Подскажите, пожалуйста, как можно в строке "^\t++<" заменить табуляцию на точно такое же количество пробелов?
Предполагается использовать AkelPad.TextReplace().

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Skif_off wrote:как можно в строке "^\t++<" заменить табуляцию на точно такое же количество пробелов?
Предполагается использовать AkelPad.TextReplace().
Требуется замена зависящая от настроек "Параметры-Редактор 1->Размер табуляции" или именно "один-к-одному"? Если второе, то можно заменить так:

Code: Select all

AkelPad.TextReplace(0, "\\t", " ", 0x00280001, true);
правда, начало строки не учитывается и замена будет производиться везде. Если требуется таки учитывать начало строки, то придется вводить функцию подсчета символов...

Code: Select all

var hWndEdit= AkelPad.GetEditWnd()
do {
var v=AkelPad.TextFind(hWndEdit, "^\\t++<", 0x00280001);
if (v > -1)
	AkelPad.TextReplace(hWndEdit, "\\t", " ", 0x00480001, true);
} while (v > -1);
Last edited by YuS on Sat Jan 23, 2016 8:54 am, edited 1 time in total.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

YuS
Один символ табуляции на один символ пробела, только в начале строки. Считать - не вариант: строк может быть слишком много.

Если AkelPad.TextFind() и AkelPad.TextReplace
()
работают как через GUI, нужно будет попробовать

Code: Select all

iFind = AkelPad.TextFind(hWndEdit, "^\t++<", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/);
if (iFind > 0)
  AkelPad.TextReplace(hWndEdit, "\t", " ", 0x00480001 /*FRF_DOWN|FRF_SELECTION|FRF_REGEXP*/, true);


А в тексте для поиска и замены слэши точно нужно удваивать? У меня так получается какая-то ерунда.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Skif_off wrote:YuS
Один символ табуляции на один символ пробела, только в начале строки. Считать - не вариант: строк может быть слишком много.

Если AkelPad.TextFind() и AkelPad.TextReplace
()
работают как через GUI, нужно будет попробовать

Code: Select all

iFind = AkelPad.TextFind(hWndEdit, "^\t++<", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/);
if (iFind > 0)
  AkelPad.TextReplace(hWndEdit, "\t", " ", 0x00480001 /*FRF_DOWN|FRF_SELECTION|FRF_REGEXP*/, true);
В таком варианте придется скрипт запускать на каждое следующее совпадение... я там добавил hint, может такой вариант подойдёт...
Skif_off wrote: А в тексте для поиска и замены слэши точно нужно удваивать? У меня так получается какая-то ерунда.
Хмм, сложно сказать, я у более опытных товарищей подсмотрел, что слеши удвоенные используются, но у меня и так работает, и эдак... т.е. подсказать как должно быть правильно, увы не могу. :)

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

YuS
Про hint не понял и да, неправ: долго и неудобно. Количество символов табуляции не бесконечное и не припомню, чтобы встречалось больше десятка - сделаю стопку правил или лучше в цикле, штук 15 итераций будет с запасом.
YuS wrote:
Skif_off wrote: А в тексте для поиска и замены слэши точно нужно удваивать? У меня так получается какая-то ерунда.
Хмм, сложно сказать, я у более опытных товарищей подсмотрел, что слеши удвоенные используются, но у меня и так работает, и эдак... т.е. подсказать как должно быть правильно, увы не могу. :)
По идее надо удваивать, но у меня тогда не работает (вставляет, например, "\n" вместо переноса.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Skif_off wrote:YuS
Про hint не понял
hint здесь
Skif_off wrote: По идее надо удваивать, но у меня тогда не работает (вставляет, например, "\n" вместо переноса.
А у меня всё одинаково работает, в обоих случаях.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

YuS
С телефона заходил, не понял, что это был тег more :) Решил сделать

Code: Select all

AkelPad.TextReplace(hWndEdit, "^\t<", " <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{2}<", "  <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{3}<", "   <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{4}<", "    <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{5}<", "     <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{6}<", "      <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{7}<", "       <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{8}<", "        <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{9}<", "         <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{10}<", "          <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{11}<", "           <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{12}<", "            <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{13}<", "             <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{14}<", "              <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{15}<", "               <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);

YuS wrote:А у меня всё одинаково работает, в обоих случаях.
Нашёл, где проблема:
вот так работает как надо

Code: Select all

AkelPad.TextReplace(hWndEdit, "></FictionBook>", ">\n</FictionBook>", 0x01000001 /*FRF_DOWN|FRF_BEGINNING|FRF_ESCAPESEQ*/, true);
а так

Code: Select all

AkelPad.TextReplace(hWndEdit, "></FictionBook>", ">\\n</FictionBook>", 0x01000001 /*FRF_DOWN|FRF_BEGINNING|FRF_ESCAPESEQ*/, true);
вставляет "\n" вместо переноса строки.

Добавлено:
Блин, сейчас перепроверил - с "\\n" отрабатывает нормально, как и положено. Подождём, всё равно повторяю валидацию после запуска.

Добавлено:
Похоже, проблема с флагами, неправильно сложил.

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Skif_off wrote:YuS
...Решил сделать

Code: Select all

AkelPad.TextReplace(hWndEdit, "^\t<", " <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{2}<", "  <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{3}<", "   <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{4}<", "    <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{5}<", "     <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{6}<", "      <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{7}<", "       <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{8}<", "        <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{9}<", "         <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{10}<", "          <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{11}<", "           <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{12}<", "            <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{13}<", "             <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{14}<", "              <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
AkelPad.TextReplace(hWndEdit, "^\t{15}<", "               <", 0x00280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true);
Может быть, просто и дубово, но зато быстро и надежно, а это главное. Скорость работы такого варианта должна быть значительно выше, чем цикла.

Offline
Posts: 6
Joined: Wed Jan 27, 2016 2:07 pm

Post by Stranger »

Подскажите, как в строке замены в скрипте с использованием AkelPad.TextReplace отделить обратную ссылку (\\1) от цифр последующего текста (в приведенном примере - 777)? Просто так не работает.

Code: Select all

AkelPad.TextReplace(0, "(some)(text)", "\\1777", 0x280001 /*FRF_DOWN|FRF_BEGINNING|FRF_REGEXP*/, true)

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Stranger
С этим лучше в тему плага, наверное. Не пробовали "$1"?

Offline
Posts: 6
Joined: Wed Jan 27, 2016 2:07 pm

Post by Stranger »

Skif_off
Попробовал, такие ссылки в принципе не работают, по-моему.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Stranger
Прошу прощения, возможности проверить не было (с телефона), вспомнил про группы в JScript.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Stranger
Можно побороть, если вместо самих цифр подставлять их коды (они от тридцати начинаются). Т.е. \x37 - это "7".

Code: Select all

AkelPad.TextReplace(hWndEdit, "(some)(text)", "\\1\\x37\\x37\\x37", 0x00280001, true);
или даже еще короче (только первая "семерка" идет кодом, а остальные две в привычном виде)

Code: Select all

AkelPad.TextReplace(hWndEdit, "(some)(text)", "\\1\\x3777", 0x00280001, true);
Post Reply