Боты и читы. Программируемый автокликер.


Визуальное создание ботов в Кибор

 Помощь      Поиск      Пользователи

 

Главная     Программируемый кликер Кибор     Видео обучение     Заказать бот

 Страниц (1): [1]   

> Описание: Поиск и замена текста по шаблонам регулярных выражений
Kibor
Отправлено: 25 Сентября, 2018 - 03:14:54
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 4938
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 178
Карма 26




regexsearch - Ищет в тексте участок по шаблону регулярного выражения.
regexreplace - Ищет в тексте участок по шаблону регулярного выражения и заменяет его на указанный текст.

regexstart - Узнает стартовую позицию найденного фрагмента. Работает только с regexsearch. Использовать данную функцию можно только после вызова regexsearch

regexend - Узнает финишную позицию найденного фрагмента. Работает только с regexsearch. Использовать данную функцию можно только после вызова regexsearch

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

Синтаксис:

regexsearch вызывается с разным количеством параметров.
Первый вызов идет такой:
CODE:
regexsearch(1, #P[0], T, R);

или с флагами
CODE:
regexsearch(1, #P[0], T, R, IGNORECASE | SINGLELINE | MULTILINE | GLOBAL | RIGHTTOLEFT | EXTENDED);

Первый параметр - желаемое количество найденных фрагментов. При -1 ищутся все.
Второй - Указатель на string или массив string (если будет искаться более одного), в который запишется найденный фрагмент.
Третий - Строка string, в которой находится текст в котором ищем.
Четвертый - Строка string регулярного выражения.
Пятый необязательный - Один или более флагов режима работы.

Последующие вызовы, если мы не искали при первом вызове все вхождения, идет с двумя параметрами.
CODE:
regexsearch(-1, #P[0]);

Первый параметр - желаемое количество найденных фрагментов. При -1 ищутся все.
Второй - Указатель на string или массив string (если будет искаться более одного), в который запишется найденный фрагмент.

При каждом последующем вызове будет искаться следующий фрагмент.

Функция regexsearch возвращает количество найденных фрагментов или 0 если не найдено.



regexreplace так же вызывается с разным количеством параметров.
Первый вызов идет такой:
CODE:
regexreplace(-1, #P, T, R, M);

или с флагами
CODE:
regexreplace(-1, #P, T, R, M, IGNORECASE | SINGLELINE | MULTILINE | GLOBAL | RIGHTTOLEFT | EXTENDED);

Первый параметр - желаемое количество заменяемых фрагментов. При -1 заменяет все.
Второй - Указатель на string, в который запишется измененный текст.
Третий - Строка string, в которой находится исходный текст в котором заменяем. Этот текст остается без изменений
Четвертый - Строка string регулярного выражения, фрагмент которого в тексте будет заменен.
Пятый - Строка string, в которой текст на который будет заменен.
Шестой необязательный - Один или более флагов режима работы.


Если нет необходимости сохранять исходный текст, можно в качестве второго и третьего параметра использовать одну и ту же переменную. Тогда измененный текст перезапишется в исходник.


Последующие вызовы, если мы не заменяли все при первом вызове все вхождения, идет с двумя параметрами.
CODE:
regexreplace(2, #P);

Первый параметр - желаемое количество найденных фрагментов. При -1 ищутся все.
Второй - Указатель на string или массив string (если будет искаться более одного), в который запишется замененный текст.

При каждом последующем вызове будет заменяться следующий фрагмент.

Функция regexreplace возвращает 1 если была замена или 0 если не было.






regexstart и regexend вызываются с разным количеством параметров, в зависимости от того как будут использоваться.

Один вызов:
CODE:
regexstart(#Pos_start[0]);


Параметр - Указатель на int или массив int, в который запишутся стартовые позиции найденных фрагментов. Массив выделять не менее количества фрагментов.

Возвращает количество найденных фрагментов, как и regexsearch.

CODE:
regexend(#Pos_end[0]);


Параметр - Указатель на int или массив int, в который запишутся финишные позиции найденных фрагментов. Массив выделять не менее количества фрагментов.

Возвращает количество найденных фрагментов, как и regexsearch.

Второй вызов используется если надо узнать позицию только одного выбранного фрагмента:

CODE:
regexstart(2);

Параметр - число означающее позицию какого фрагмента надо узнать.
В данном примере узнаем стартовую позицию 3 элемента.
Возвращает позицию элемента или -1, если данного элемента нет.


CODE:
regexend(2);

Параметр - число означающее позицию какого фрагмента надо узнать.
В данном примере узнаем финишную позицию 3 элемента.
Возвращает позицию элемента или -1, если данного элемента нет.




Описание флагов
IGNORECASE
По умолчанию регулярное выражение чувствительно к регистру. Примените этот режим, чтобы не учитывать регистр. Но наборы символов всегда чувствительны к регистру.

SINGLELINE
По умолчанию точка может соответствовать любому символу, кроме новой строки (\n). Режим SINGLELINE позволит точке соответствовать любому символу.

MULTILINE
Измените "^" и "$" на соответствие началу или концу строки для соответствия началу или концу любой строки в любом месте строки.
SINGLELINE и MULTILINE не исключают друг друга. Они имеют разные функции в разных местах, поэтому их можно использовать вместе.
Утверждения '\A' и '\Z' используются для соответствия только началу и концу строки, независимо от того, указан ли флаг MULTILINE.

GLOBAL
GLOBAL действует только на \G. Он позволяет \G соответствовать окончанию последнего совпадения, когда много раз повторяется. Без флага GLOBAL \G не используется в шаблоне.
По умолчанию операция замены заменит все совпадения, если даже GLOBAL не указан. Если вы не хотите заменять все совпадения, вы можете указать, сколько раз.

RIGHTTOLEFT
Поиск и замена справа на лево.

EXTENDED
Игнорирует символы пробела в шаблоне и рассматривает символы от # до конца строки как примечание.



Примеры:

Ищем по одному
CODE:
string P;
string T="1 USD Курс Доллара 66,8932 0,516 66,3772" +formatic(13)+formatic(10)+ "1 EUR Курс Евро 76,0576 0,8323 75,2253 Курс Гривны 0,0005"; // строка, в которой ищем
string R="Курс.*?(\d+[,.]\d+)";//регулярное выражение
if (regexsearch(1, #P, T, R)!=0)
{
messagebox (P);
while (regexsearch(1, #P)!=0)
{
messagebox (P);
}
}



Ищем все и пишем в массив
CODE:
string P[10];
string T="1 USD Курс Доллара 66,8932 0,516 66,3772" +formatic(13)+formatic(10)+ "1 EUR Курс Евро 76,0576 0,8323 75,2253 Курс Гривны 0,0005"; // строка, в которой ищем
string R="Курс.*?(\d+[,.]\d+)";//регулярное выражение
int k=regexsearch(-1, #P[0], T, R);
for (int n=0; n<k; n++)
{
messagebox (P[n]);
}



Найти в строке текст между value" и </div>
CODE:
string P;
string T="<div class="+formatic(34)+"info-value"+formatic(34)+">Âîðîíåæ, Ñîâåòñêèé ð-í</div>"; // ñòðîêà, â êîòîðîé èùåì
string R="(?<=value\"+formatic(34)+">)"+"(.*)+(?=</div>)";//ðåãóëÿðíîå âûðàæåíèå.
if (regexsearch(1, #P, T, R)==1)messagebox (P );


Поиск числа между WR, но WR не выводится в результат
CODE:
string P[10];
string T="WR555WR WRworldWR 777 нет WR222WR"; // строка, в которой ищем
string R="(?<=WR)[0-9]+(?=WR)";//регулярное выражение. WR не выводится в результат
int k=regexsearch(-1, #P[0], T, R);
for (int n=0; n<k; n++)
{
messagebox (P[n]);
}


Найдет test если после него есть bar или foo
CODE:
string P;
string T="testbarfoo";
//string T="testfoobar";
string R="^test(?=.*bar)(?=.*foo)";
if (regexsearch(1, #P, T, R)==1)messagebox (P);


Разные переменные для источника и приемника
CODE:
string T="qwertАБВqwertАБВ"; // строка, в которой заменяем
string R="[А-Я]";//Что заменяем (регулярное выражение)
string M="ГаВ";//Чем заменяем
string P;//Сюда запишем измененный текст

int k=regexreplace(2, #P, T, R, M);
messagebox (k);
messagebox (P);

k=regexreplace(-1, #P);
messagebox (k);
messagebox (P);




Одна переменная для источника и приемника
CODE:
string T="qwertАБВqwertАБВ"; // строка, в которой заменяем
string R="[А-Я]";//Что заменяем (регулярное выражение)
string M="ГаВ";//Чем заменяем

int k=regexreplace(2, #T, T, R, M);
messagebox (k);
messagebox (T);

k=regexreplace(-1, #T);
messagebox (k);
messagebox (T);


Замена чисел между WR
CODE:
string T="WR555WR WRworldWR 777 df WR222WR"; // строка, в которой заменяем
string R="(?<=WR)[0-9]+(?=WR)";//регулярное выражение. WR не заменяется
string M="ГаВ";//Чем заменяем

int k=regexreplace(1, #T, T, R, M);
messagebox (k);
messagebox (T);

k=regexreplace(-1, #T);
messagebox (k);
messagebox (T);


Удалить все пробелы при распознавание текста
CODE:
readtext (NUM, #Text, 8, 1, -1, -1, -1, -1, -1, 0, -1, ZVx1, ZVy1, ZVx2, ZVy2, -1);
regexreplace(-1, #Text, Text, " ", "");
messagebox (Text);


Символ " надо на данный момент заменять на formatic(34)
Поиск между =" и "]
CODE:
string T="поиск между ="+formatic(34)+"текст"+formatic(34)+"] и этим";
messagebox (T);
string R="(?<=="+formatic(34)+")(.*)(?="+formatic(34)+"])";
if (regexsearch(1, #T, T, R)==1)messagebox (T);
 
 Top
Skycrew
Отправлено: 26 Сентября, 2018 - 04:58:19
Post Id



Пользователь
Участник


Покинул форум
Сообщений всего: 98
Дата рег-ции: Июль 2014  
Репутация: 0
Карма 0




Вот это офигенно! Я как раз собрался парсер делать) Спасибо!
p.s. К сожалению нет пейпола((
 
 Top
Kibor
Отправлено: 26 Сентября, 2018 - 05:37:32
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 4938
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 178
Карма 26




Skycrew , Пользуйтесь) Если что не хватает - пишите.
Попозже добавлю еще возврат позиций, работу с char
 
 Top
Kibor
Отправлено: 27 Сентября, 2018 - 08:37:39
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 4938
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 178
Карма 26




Добавил флаги

IGNORECASE
По умолчанию регулярное выражение чувствительно к регистру. Примените этот режим, чтобы не учитывать регистр. Но наборы символов всегда чувствительны к регистру.

SINGLELINE
По умолчанию точка может соответствовать любому символу, кроме новой строки (\n). Режим SINGLELINE позволит точке соответствовать любому символу.

MULTILINE
Измените "^" и "$" на соответствие началу или концу строки для соответствия началу или концу любой строки в любом месте строки.
SINGLELINE и MULTILINE не исключают друг друга. Они имеют разные функции в разных местах, поэтому их можно использовать вместе.
Утверждения '\A' и '\Z' используются для соответствия только началу и концу строки, независимо от того, указан ли флаг MULTILINE.

GLOBAL
GLOBAL действует только на \G. Он позволяет \G соответствовать окончанию последнего совпадения, когда много раз повторяется. Без флага GLOBAL \G не используется в шаблоне.
По умолчанию операция замены заменит все совпадения, если даже GLOBAL не указан. Если вы не хотите заменять все совпадения, вы можете указать, сколько раз.

RIGHTTOLEFT
Поиск и замена справа на лево.

EXTENDED
Игнорирует символы пробела в шаблоне и рассматривает символы от # до конца строки как примечание.
 
 Top
Kibor
Отправлено: 07 Октября, 2018 - 12:27:13
Post Id



Администратор
Эксперт


Покинул форум
Сообщений всего: 4938
Дата рег-ции: Март 2013  
Откуда: Одесса
Репутация: 178
Карма 26




Добавил функции возвращающие позиции найденных фрагментов
regexstart - Узнает стартовую позицию найденного фрагмента. Работает только с regexsearch. Использовать данную функцию можно только после вызова regexsearch

regexend - Узнает финишную позицию найденного фрагмента. Работает только с regexsearch. Использовать данную функцию можно только после вызова regexsearch

Подробнее (для просмотра ссылки Вам необходимо авторизоваться)
 
 Top
AdryV
Отправлено: 21 Октября, 2018 - 08:18:54
Post Id



Пользователь
Специалист


Покинул форум
Сообщений всего: 284
Дата рег-ции: Май 2016  
Репутация: 3
Карма 3




подскажите возможно ли с помощью этой функции выполнить это
152211(50),5663(60)
нужно что бы записало число 152211 в один массив а что в скобках 50 в другой массив
под тем же номером ну и так несколько раз
(Добавление)
я так понимаю ток такой способ?
CODE:
string P[50];
string T="152211(50),5663(60)";
string R="\d+";
int te[50];
int te1[50];

int k=regexsearch(-1, #P[0], T, R);
messagebox (k);
for (int n=0; n<k; n++)
{
te[n]=formatsn(P[n]);
messagebox (te[n]);
n++;
te1[n]=formatsn(P[n]);
messagebox (te1[n]);
}
 
 Top
Zireael
Отправлено: 21 Октября, 2018 - 11:31:18
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 596
Дата рег-ции: Нояб. 2017  
Репутация: 70
Карма 13




Многое зависит от корректности данных. Если в строке не будет ничего лишнего , то можно и так. Например, если могут быть числа, перед которыми нет числа в скобках, то лучше так:
CODE:
string P[50];
string T="152211(50), 6666, 5663(60)"; // 6666 не запишется в массив, т. к. перед ним нет числа в скобках
string R="\d+(?=\()"; // число, перед которым есть скобка, скобка экранируется обратным слешем \(
string R2="(?<=\()\d+(?=\))"; // число между скобками
int te[50];
int te1[50];
int n, k;

k=regexsearch(-1, #P[0], T, R);
for (n=0; n<k; n++)
{
te[n]=formatsn(P[n]);
messagebox (te[n]);
}

k=regexsearch(-1, #P[0], T, R2);
for (n=0; n<k; n++)
{
te1[n]=formatsn(P[n]);
messagebox (te1[n]);
}

Если в строке могут быть пробелы, то это тоже надо учесть в регулярном выражении.
 
 Top
Zireael
Отправлено: 02 Декабря, 2018 - 15:06:28
Post Id



Пользователь
Эксперт


Покинул форум
Сообщений всего: 596
Дата рег-ции: Нояб. 2017  
Репутация: 70
Карма 13




 Цитата:
Если что не хватает - пишите.

CODE:
string R="Курс.*?(\d+[,.]\d+)";

Должно возвращать только число, т. е. подгруппу в скобках. Без скобок - всю строку.


Добавить возможность возвращать результат в двухмерный стринг, если ищутся несколько подгрупп.
Например:
CODE:
string arr[10][2]; // сюда записать результат
string s="Время 12:30, 14:25"; // строка, в которой надо найти время
string R="\d{2}:\d{2}"; // регулярное выражение вернёт всю захваченную строку, т. е. 12:30 и 14:25

string R2="(\d{2}):(\d{2})"; // а так, возвращать 12 в arr[0][0], 30 в arr[0][1]
// 14 в arr[1][0], 25 в arr[1][1];
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« О программе Кибор »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 




Powered by