007wan |
Отправлено: 22 Мая, 2019 - 13:06:37
|
Эксперт
Покинул форум
Сообщений всего: 1837
Дата рег-ции: Март 2017
Репутация: -2
|
Извините, но я иногда не с первого раза понимаю)
(Добавление)
Kibor пишет: Правильно, это выделять достаточно памяти для строки. ну, тогда не 10, а 255?
(Добавление)
CODE:char c[255];//это буфер для текста 255 байт для всего текста
char b[10];//нужно взять 10 символов из всего текста
string s="123456789089890";//текст
strcpy(#c[0], s);
messagebox (format(#c[0])); |
|
|
Zireael |
Отправлено: 22 Мая, 2019 - 13:18:27
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: нужно взять 10 символов из всего текста
CODE:char c[11];
string s="123456789089890";//текст
string ss;
if(regexsearch(1, #ss, s, ".{1, 10}"))
{
strcpy(#c[0], ss);
messagebox (format(#c[0]));
} (Отредактировано автором: 22 Мая, 2019 - 13:19:06) |
|
|
Kibor |
Отправлено: 27 Июля, 2019 - 22:34:41
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Пример парсинга JSON структуры для поиска в ней данных по названию:
К примеру есть структура
CODE:{"error":"not error","balance":5.36804,"id":12}
Необходимо узнать данные по любому элементу.
CODE:string fr="{"+formatic(34)+"error"+formatic(34)+":"+formatic(34)+"not error"+formatic(34)+"," + formatic(34)+"balance"+formatic(34)+":5.36804,"+formatic(34)+"id"+formatic(34)+":12}";
messagebox (fr);
string find="balance";//Что ищем
if (find_JSON(fr, #find))//Если вернула 1
{
messagebox (find);//Выводим результат
}
function find_JSON(string json, string #find)
{
string res;
find=formatic(34)+find+formatic(34)+":";
if (regexsearch(1, #res, json, "(?<="+find+")(\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+")([-+]+\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+")(\d+.\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+")([-+]+\d+.\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+formatic(34)+")(.*)+(?="+formatic(34)+"[,}])")==1) {find=res; return 1;}
return 0;
} |
|
|
Zireael |
Отправлено: 27 Июля, 2019 - 22:56:00
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: (\d+)
Скобки не нужны, ссылка на подгруппу не используется, а возврат подгрупп не реализован (неплохо бы этого доделать).
CODE:if (regexsearch(1, #res, json, "(?<="+find+")(\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+")([-+]+\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+")(\d+.\d+)(?=[,}])")==1) {find=res; return 1;}
if (regexsearch(1, #res, json, "(?<="+find+")([-+]+\d+.\d+)(?=[,}])")==1) {find=res; return 1;}
Тоже самое:
CODE:if (regexsearch(1, #res, json, "(?<="+find+")[-+]*\d+(\.\d+)*")==1) {find=res; return 1;} |
|
|
Zireael |
Отправлено: 28 Июля, 2019 - 01:04:02
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: могут быть пробелы неизвестное количество?
\s* - означает 0 или больше пробелов. Точнее не только пробелов, \t \r \n тоже. Если нужен именно пробел, то ' *'.
Важно:
Цитата: (?<=тут нельзя использовать квантификаторы * и +)
(?=тут можно)
CODE:string s=", "+"123"; // с пробелами
messagebox(s);
// если пробела нет, то найдёт '123'
// если есть, то ' 123', т. е. пробелы тоже будут
if(regexsearch(1, #s, s, "(?<=,)\s*\d+"))messagebox("Найденный текст: "+s+", длина текста: "+format(size(s))); // пробелы нужно удалять отдельно
s=","+"123"; // без пробела
if(regexsearch(1, #s, s, "(?<=,)\s*\d+"))messagebox("Найденный текст: "+s+", длина текста: "+format(size(s)));
s="123"+" }"; // с пробелами
messagebox(s);
if(regexsearch(1, #s, s, "\d+(?=\s*})"))messagebox("Найденный текст: "+s+", длина текста: "+format(size(s))); // пробелы не попадут в результат
s="123"+"}"; // без пробела
if(regexsearch(1, #s, s, "\d+(?=\s*})"))messagebox("Найденный текст: "+s+", длина текста: "+format(size(s))); // пробелы не попадут в результат
Если добавить возможность возвращать текст из подгрупп (то что в скобках), то можно не использовать (?<=) и (?=). Т. е. для строки ", 123" регулярка ",\s*(\d+)". Соответственно вернуть всё что нашлось, а отдельной функцией, по типу regexstart, вернуть текст, который находится в скобках. Скорее всего в библиотеке это должно быть. |
|
|
|