Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Регулярные выражения
Fire73
сообщение 16.9.2019, 16:01
Сообщение #1


**

Neophyte
Сообщений: 31
Регистрация: 5.6.2019
Группа: Пользователи
Наличность: 1
Пользователь №: 19.343
Возраст: 23



Ребят, такая ситуация, такой скрипт.

В текстовом документе REG.txt следующее:
@Zolotoy Serebro Bronza


Код
load_array %arr C:\Users\REG.txt
//log %arr [1]   // первая строка из файла
//log %arr [2]   // вторая

log clear
log mode compact

set $regexp "[^ ]+"
set #n regexp (#pos $one %arr[1] $regexp)  // поиск в строке любого текста до пробела
if  #n = 1
end_if

set $regexp "(?<= )[^ ]+"
set #n regexp (#pos $two %arr[1] $regexp)  // поиск в строке текста после пробела
if  #n = 1
end_if

set clipboard $two
sendex ^v


Вопрос:
1) $two в моем случае это - Serebro, но как сделать так, чтобы к слову генерировался дополнительный случайный символ, чтобы, например, в итоге получилось Serebrom, Serebroz...?
2) Какое составить регулярное выражение, чтобы к 3 слову в REG.txt было тоже присвоено имя #three
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 17.9.2019, 1:32
Сообщение #2


**********

Elder
Сообщений: 2.702
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 17354
Пользователь №: 16.971
Возраст: 29



Цитата
чтобы к слову генерировался дополнительный случайный символ

Код
set $two serebro
set #rand 97 + random(26)
init_arr %a (1) $two chr(#rand)
log %a[1]
end_script

Цитата
2) Какое составить регулярное выражение, чтобы к 3 слову в REG.txt было тоже присвоено имя #three

Код
set $regexp "[^ ]+$"
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 17.9.2019, 12:30
Сообщение #3


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



Цитата(Fire73 @ 16.9.2019, 16:01) *

Ребят, такая ситуация, такой скрипт.

В текстовом документе REG.txt следующее:
@Zolotoy Serebro Bronza
Код
Код
load_array %arr C:\Users\REG.txt
//log %arr [1]   // первая строка из файла
//log %arr [2]   // вторая

log clear
log mode compact

set $regexp "[^ ]+"
set #n regexp (#pos $one %arr[1] $regexp)  // поиск в строке любого текста до пробела
if  #n = 1
end_if

set $regexp "(?<= )[^ ]+"
set #n regexp (#pos $two %arr[1] $regexp)  // поиск в строке текста после пробела
if  #n = 1
end_if

set clipboard $two
sendex ^v


Вопрос:
1) $two в моем случае это - Serebro, но как сделать так, чтобы к слову генерировался дополнительный случайный символ, чтобы, например, в итоге получилось Serebrom, Serebroz...?
2) Какое составить регулярное выражение, чтобы к 3 слову в REG.txt было тоже присвоено имя #three

Ну и вообще можешь в целом сильно сократить свой код:
Код
load_array %arr C:\Users\REG.txt
get word $two 2 %arr[1]
get word $three 3 %arr[1]
set #rand random(26) + 97
set $smbl chr(#rand)
set $two $two$smbl

log $two
log $three
end_script


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fire73
сообщение 18.9.2019, 13:05
Сообщение #4


**

Neophyte
Сообщений: 31
Регистрация: 5.6.2019
Группа: Пользователи
Наличность: 1
Пользователь №: 19.343
Возраст: 23



Спасибо, ребят!
А вот если добавить 2 рандомные буквы, а не одну?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 18.9.2019, 13:48
Сообщение #5


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



Код
load_array %arr C:\Users\REG.txt
get word $two 2 %arr[1]
get word $three 3 %arr[1]
set #rand random(26) + 97
set #rand1 random(26) + 97
set $smbl chr(#rand)
set $smbl1 chr(#rand1)
set $two $two$smbl$smbl1

log $two
log $three
end_script


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 14.2.2020, 21:38
Сообщение #6


*****

Journeyman
Сообщений: 319
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1783
Пользователь №: 18.346
Возраст: 25



Все разабрауся
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 16.2.2020, 16:52
Сообщение #7


*****

Journeyman
Сообщений: 319
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1783
Пользователь №: 18.346
Возраст: 25



Есть регулярное вырожение: -0x[0-5][0-9]$
как записать что бы числа могли искаться
-0x01
-0x10
-0x20
-0x59
но не включало в результат поиска два нуля:
-0x00
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 16.2.2020, 17:06
Сообщение #8


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



Цитата(FREEON @ 16.2.2020, 16:52) *

Есть регулярное вырожение: -0x[0-5][0-9]$
как записать что бы числа могли искаться
-0x01
-0x10
-0x20
-0x59
но не включало в результат поиска два нуля:
-0x00

Код
load_array %a "C:\qwe.txt"
set $rgxp "(?<=(?!(-0x00)))-0x[0-5][0-9](?=$)"
for #i 1 size(%a)
    set #n regexp (#p $a %a[#i] $rgxp)
    if #n > 0
        set $res $res $a
    end_if
end_for
init_arr %result (1 1) $res
save_array %result "C:\qwe_result.txt"
end_script


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 16.2.2020, 17:55
Сообщение #9


**********

Elder
Сообщений: 2.702
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 17354
Пользователь №: 16.971
Возраст: 29



Цитата
set $rgxp "(?<=(?!(-0x00)))-0x[0-5][0-9](?=$)"

Или так:
Код
set $rgxp "-0x(0[1-9]|[1-5][0-9])$"
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 16.2.2020, 18:09
Сообщение #10


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



Цитата(cirus @ 16.2.2020, 17:55) *

Или так:
Код
set $rgxp "-0x(0[1-9]|[1-5][0-9])$"


Да, тоже интересный вариант(IMG:https://forum.uokit.com/style_emoticons/default/ok.gif)


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 17.2.2020, 15:38
Сообщение #11


*****

Journeyman
Сообщений: 319
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1783
Пользователь №: 18.346
Возраст: 25



Вот еще задачка. нужно найти все комментарии однострочные и многострочные, но данная регулярка не совсем корректно находит многострочные комментарии. Всего комментариев 7(для наглядности в тексте примера их пронумеровал и отметил жиром) из них: 5 однострочных и 2 многострочных
Вот рег: <!--(.+|(.|\s)*)-->
Вот пример текста:
<!--1 однострочный коментарий-->
текст <!-- 2 Это -- комментарий -->
текст
<!-- 3 многострочный
коментарий
текст какой-то-->
текст
Эт0
к0д
какой-то
<!-- 4
это еще один
ногострочный
коментарий
-->
текст
<!-- 5 это считается коментарием <!-- и это коментарием --> а этот текст уже нет-->
<!-- 6 --><!--7-->
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 17.2.2020, 19:07
Сообщение #12


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



Цитата(FREEON @ 17.2.2020, 15:38) *

Вот еще задачка. нужно найти все комментарии однострочные и многострочные, но данная регулярка не совсем корректно находит многострочные комментарии. Всего комментариев 7(для наглядности в тексте примера их пронумеровал и отметил жиром) из них: 5 однострочных и 2 многострочных
Вот рег: <!--(.+|(.|\s)*)-->
Вот пример текста:

<!--1 однострочный коментарий-->
текст <!-- 2 Это -- комментарий -->
текст
<!-- 3 многострочный
коментарий
текст какой-то-->
текст
Эт0
к0д
какой-то
<!-- 4
это еще один
ногострочный
коментарий
-->
текст
<!-- 5 это считается коментарием <!-- и это коментарием --> а этот текст уже нет-->
<!-- 6 --><!--7-->


Код
log clear_current
log mode compact
load_array %a "C:\qwe.txt"
set $rgxp1 "<!--.*?(-->|$)(?!.*(?=<!--))"
set $rgxp2 "^.*?-->(?!.*(?=<!--))"

for #i 1 size(%a)
    if regexp(#p $a %a[#i] $rgxp1)
        log $a
        while copy($a eval(size($a)-2) 3) != -->
            set #i #i + 1
            set #n regexp(#p $a %a[#i] $rgxp2)
            if copy($a eval(size($a)-2) 3) = -->
                log $a
                break
            else
                log %a[#i]
            end_if
        end_while
        log
    end_if
end_for

log save_current C:\qwe_result.txt
exec notepad "C:\qwe_result.txt"
end_script


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 18.2.2020, 1:35
Сообщение #13


**********

Elder
Сообщений: 2.702
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 17354
Пользователь №: 16.971
Возраст: 29



Fors1k, в твоём коде
Цитата
<!-- 6 --><!--7-->

считаются как один комментарий.
Код
--lua
log "clear"  log "mode compact"
local f = io.open([[C:\qwe.txt]], "rb")  -- открыть файл для чтения
local f2 = io.open([[C:\qwe_result.txt]], "wb")  -- открыть файл для записи

if f and f2 then   -- если открылся
       local s = f:read("*a")     -- прочитать файл
       f:close()  -- закрыть файл

        for w in s:gmatch("<%!%-%-.-%-%->") do   -- поиск
            log (w .. "\r\n")
            f2:write(w .. "\r\n")
        end
        f2:close()  -- закрыть файл
end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 18.2.2020, 4:03
Сообщение #14


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



Цитата(cirus @ 18.2.2020, 1:35) *
Fors1k, в твоём коде
Цитата
<!-- 6 --><!--7-->
считаются как один комментарий.

Точно, спасибо. В заблуждение ввело отсутствие меж ними текста:)

Код
log clear_current
log mode compact
load_array %a C:\qwe.txt
for #i 1 size(%a)
    set $a %a[#i]
    while regexp(#p $r $a <!--.*?(-->|$))
        log $r
        while copy($r eval(size($r)-2) 3) != -->
            set #i #i + 1
            set $a %a[#i]
            if regexp(#p $r $a ^.*?-->)
                log $r
                break
            end_if
            log %a[#i]
        end_while
        set $a string_replace($a $r "")
    end_while
end_for
log save_current C:\qwe_result.txt
end_script


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 18.2.2020, 12:40
Сообщение #15


*****

Journeyman
Сообщений: 319
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1783
Пользователь №: 18.346
Возраст: 25



Можно и так:
<!--(??!-->)[\s\S])*-->
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 18.2.2020, 13:22
Сообщение #16


****

Apprentice
Сообщений: 294
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 1405
Пользователь №: 18.746
Возраст: 26



code
Код
--lua
log "clear"  log "mode compact"
local f = io.open([[C:\qwe.txt]], "rb")  -- открыть файл для чтения
local f2 = io.open([[C:\qwe_result.txt]], "wb")  -- открыть файл для записи

if f and f2 then   -- если открылся
       local s = f:read("*a")     -- прочитать файл
       f:close()  -- закрыть файл

        for w in s:gmatch("<%!%-%-.-%-%->") do   -- поиск
            log (w .. "\r\n")
            f2:write(w .. "\r\n")
        end
        f2:close()  -- закрыть файл
end

Удобно, что в луа есть поиск сразу по всему файлу, всех совпадений. Надеюсь в новой версии пилота тоже скоро появится такая возможность.
Цитата(FREEON @ 18.2.2020, 12:40) *

Можно и так:
<!--(??!-->)[\s\S])*-->

В какое место кода это вставить?


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 18.2.2020, 13:31
Сообщение #17


*****

Journeyman
Сообщений: 319
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1783
Пользователь №: 18.346
Возраст: 25



Цитата(Fors1k @ 18.2.2020, 13:22) *

В какое место кода это вставить?

Простите, нужно было сразу указать что это регулярное выражение не для пилота нужна, а в скрипт патча андроид приложения, для сгонки веса если патчить с мобильного девайса. А так вам также огромное спасибо можно искать выводить файлы и комментарий в лог или файл, что также значительно упрощает работу.
Да и так багаж знаний пополнить можно...ведь совсем недавно я эти регулярки обходил стороной, казалось чем-то сверх фантастичным. Но надоело от них бегать и сейчас по-тиху уже стараюсь вникнуть в суть и они уже кажутся не такими страшными как раньше
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 26.2.2020, 6:13
Designed by Nickostyle