101 (изменено: teadrinker, 2018-10-08 18:30:42)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Или так:


list =
(Join`r`n
# Список

On
    BaseType "тип"
    SetBorderColor 74 0 160
    SetFontSize 30
   
On
    BaseType "тип1" "Тип2" "тип3" "Тип4" "тип-другое"
    SetTextColor 255 200 0
    SetBackgroundColor 127 127 127
   
Off
    Count >= 30
    BaseType "Type"
    SetTextColor 197 255 23
    SetBackgroundColor 255 255 255 0
    SetBorderColor 255 255 255 0
    SetFontSize 25
On
    Class "Item Class" "Класс предмета"
    SetTextColor 197 255 23
    SetBackgroundColor 0 0 0 0
    SetBorderColor 197 255 23
    SetFontSize 25
)

while RegExMatch(list, "sO)\R\K(On|Off).*?(?=\R+(?1)|$)", match, match ? match.Pos + match.Len : 1)
	MsgBox, % "|" match[0] "|"
 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

102

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Здравствуйте.
Не подскажите можно ли в AHK сделать инверсию (все кроме) поиска?
Просто необходимо пройтись регулями по html, который лежит в текстовом (txt) файле в одну строку, html помещается в переменную html_data с помощью FileReadLine.  Отошел от сути вопроса...

Суть в том что не понимаю можно ли в AHK сделать так что бы он нашел все кроме определенного шаблона? Сейчас под рукой нет html_data, поэтому попробую показать на примере. (Что нашел)

Хочу понять как сделать так что бы регули удали все что не похоже по шаблону вот на это:
Оригинал:

<span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span>

Шаблон:

html_data:=RegExReplace("<span class=.right-rates-sum. data-reactid=.*?>.*</span>", " ")

Можно как-нибудь сделать исключение/инверсию для этого шаблона? Удалить все кроме данного шаблона.

103

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Непонятно описано. Хотите получить значения из строки?


str = <span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span>
RegExMatch(str,"data-reactid=""([\d\.]+)"">([\d\.]+)", match)
MsgBox % "data-reactid = " match1 "`nspan-text = " match2

104 (изменено: romzes96, 2019-01-10 19:24:25)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

KusochekDobra нет. Хочу получить все сходства с шаблоном, а остальное удалить.

Шаблон: (ранее была ошибка)

html_data:=RegExReplace(html_data, "<span class=.right-rates-sum. data-reactid=.*?>.*</span>", " ")

В html_data лежит большой html страницы из которого нужно получить только шаблон и его вариации, так как после числа 7 символы меняються, сначала от 1 до 0, затем от a до z, после чего складываються и снова меняються в порядке от 1a до 0z.

Но я не понял как произвести инверсию всего шаблона что-то типа (^\d) только вот так (^шаблон).  Но так просто не получается.

105

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Иными словами, в html_data, строка <span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span> встречается несколько раз, с изменёнными значениями data-reactid и содержимого тега span, а Вам, требуется получить каждую такую строку, без остального содержимого html_data. Верно?

106

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

KusochekDobra, да извините за корявое обьяснение. Сейчас я дополню смог добраться до пк.
Но да именно так.

107

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]


reg_ex = (<span class="right-rates-sum" data-reactid="[\d\w\.]+">[\d\.]+</span>)

str =
(LTrim Join`r`n
	Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
	<span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span>
	Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
	<span class="right-rates-sum" data-reactid=".7.a.1x.0">3104.2</span>
	Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
	<span class="right-rates-sum" data-reactid=".7.3y.1.c">411</span>
	Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
)

i := 1, match := result := ""
While i := RegexMatch(str, reg_ex, match, i + StrLen(match))
{
	result .= match1 "`n"
}

MsgBox % result

108 (изменено: romzes96, 2019-01-10 20:09:31)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

KusochekDobra спасибо пример написанный Вами работает но только в виде примера
Я попробовал перенести Ваш пример в свой код, и он выдает пустой MsgBox.
Вот так:
http://prntscr.com/m5g1s3

Вот html_data что я использую.
UPD:
Нененене понял сейчас перепроверю. Этот скрипт не имеет %A_ScriptDir% тут ошибка с моей стороны секунду!)
UPD2:
Всё работает спасибо большое!!!!
UPD3:
Форум не дал написать полную благодарность Но я крайне благодарен Вам за помощь постараюсь вникнуть в написанное.

109

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Или так:

pattern = <span class="right-rates-sum" data-reactid=.*?</span>

str =
(LTrim Join`r`n
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.a.1x.0">3104.2</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.3y.1.c">411</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
)

MsgBox, % RegExReplace(str, "s).*?(" . pattern . ")|((?!\1).)*", "$1")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

110 (изменено: KusochekDobra, 2019-01-11 00:30:32)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

romzes96, переменная str, в которую FileReadLine помещает текст файла, вмещает примерно треть от всего файла. Если верить FileGetSizeize, его размер 166877, в то время как str вмещает только 65535. Воспользуйтесь FileRead для этого.

Так же, span иногда содержит ещё и запятую, так что замените RegEx-шаблон на этот:

reg_ex = (<span class="right-rates-sum" data-reactid="[\d\w\.]+">[\d\.\,]+</span>)

111

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

teadrinker, прокомментируйте пожалуйста, что я не правильно понимаю в Вашей предыдущей записи:

MsgBox, % RegExReplace(str, "s).*?(" . pattern . ")|((?!\1).)*", "$1")

Утверждение гласит, что если текст соответствует "pattern", то поместить его в обратную ссылку, иначе, поместить строку, которая не содержит единицу, за которой следует любой знак?

112 (изменено: teadrinker, 2019-01-11 02:18:44)

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Часть паттерна до знака | ищет текст до ближайшего сабпаттерна и сам этот сабпаттерн и всё это заменяет на текст сабпаттерна. Это проделывается во всей переменной str, пока подобные конструкции находятся:

pattern = <span class="right-rates-sum" data-reactid=.*?</span>

str =
(
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.a.1x.0">3104.2</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.3y.1.c">411</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
)

MsgBox, % RegExReplace(str, "s).*?(" . pattern . ")", "$1")

Вторая часть паттерна (после знака |) используется, если не найдена первая. \1 — это обратная ссылка на первый найденный подшаблон, используется только для сокращения записи, описано здесь. То-есть, вторую часть можно было бы записать, как "((?!" . pattern . ").)*". Она удаляет все символы за которыми не следует наш подшаблон.

Но проверив ещё раз, я выяснил, что перемудрил немного, достаточно:

pattern = <span class="right-rates-sum" data-reactid=.*?</span>

str =
(
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.3.1.0">210.42</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.a.1x.0">3104.2</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
   <span class="right-rates-sum" data-reactid=".7.3y.1.c">411</span>
   Какой-то текст ... Какой-то текст ... Какой-то текст ... Какой-то текст ... 
)

MsgBox, % RegExReplace(str, "s).*?(" . pattern . ")|.*", "$1")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

113

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

teadrinker пишет:

Она удаляет все символы за которыми не следует наш подшаблон.

На самом деле не совсем так. Если точнее, в этой части весь текст заменяется на текст найденного в ней подшаблона, но так как в ней этого текста нет, заменяется на пустоту.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

114

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Как полезно иногда справку почитать.
Ещё интересное решение:


Global result := "", counter := 1
reg_ex = (<span class="right-rates-sum" data-reactid="[\d\w\.]+">[\d\.\,]+</span>)(?CMatchMe)

FileRead, str, html_data.txt
RegExMatch(str, reg_ex)
MsgBox % result

MatchMe(m) {
	result .= counter++ ". - " m1 "`n"
	Return 1
}

115

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Шаблон поиска в скобки брать необязательно.

116

Re: AHK: Вопросы по RegExp [, RegEx, RegExMatch, RegExReplace]

Global result := "", counter := 1
reg_ex = <span class="right-rates-sum" data-reactid="[\d\w\.]+">[\d\.\,]+</span>(?CMatchMe)

FileRead, str, html_data.txt
RegExMatch(str, reg_ex)
MsgBox % result

ExitApp
MatchMe(m) {
	result .= counter++ ". - " m "`n"
	Return 1
}