Re: AHK: Регулярные выражения
Напишите в тему TF, или заведите новую.
Дайте ссылку на тему, пожалуйста.
stealzy, Тема смежная, и так или иначе, как мне кажется, имеет отношение к регулярным выражениям, пусть и заключенных в функции, поэтому, написал здесь.
Malcev, спасибо! Работает.
И все таки, чтобы понять, как правильно пользоваться функцией TF_RemoveLines, стоит создать отдельную тему или все-таки она уже существует в комьюнити?
Re: AHK: Регулярные выражения
becauseim, а почему вы выводите переменную msg?
Она же в результате данной функции не меняется.
#include tf.ahk
msg =
(
123
456
789
000000
)
msgbox % TF_RemoveLines(msg, 1,3)
MsgBox % msg
Re: AHK: Регулярные выражения
becauseim
Создайте. Я нашёл её упоминание только в этом топике. Здесь оффтоп.
Re: AHK: Регулярные выражения
Malcev, понял, спасибо!
206 2017-04-08 13:24:16 (изменено: mozers, 2017-04-08 13:30:47)
Re: AHK: Регулярные выражения
я не понимаю, как отредактировать предложенное таким образом, чтобы удалялись не три, а четыре строки с начала текста, а также, например, пять, а не три символов
И предложеный вариант пользователем Malcev не был забракован
Ну если так, то, извините. Тогда все просто:
msg =
(
123
456
789
999999
000000
)
ls := 4 ; кол-во удаляемых строк
cs := 5 ; кол-во удаляемых символов
msgbox % RegexReplace(msg, "^(.*?\R){" ls "}[^\r\n]{0," cs "}\R?")
Модератор: Перенесено из альтернативной темы.
Re: AHK: Регулярные выражения
mozers, спасибо! Видимо, я не до конца протестировал и этот вариант, но кажется, выражение удаляет заданное количество символов с первой оставшейся строки после удаленных строк. Т.е. возможности выбрать конкретную строку, в начале которой необходимо удалить символы, не предусмотрено. Иными словами, все желания удовлетворены, кроме одного:
...чтобы удалялись не три, а четыре строки с начала текста, а также, например, пять, а не три символов с восьмой, а не четвертой строки.
Re: AHK: Регулярные выражения
becauseim
А теперь тоже самое, но по русски:
Удалить A строк c начала текста. Затем удалить со строки, которая до удаления начальных строк имела номер B, C символов с начала.
msg =
(
1_aaaaaaa
2_bbbbbbbbb
3_ccccc
5_eeee
6_fffffff
7_ggggG
8_hhhhhh
9_iiiiiii
)
a := 5 ; кол-во удаляемых строк в начале
b := 7 ; номер строки в которой будут удалятся символы
c := 6 ; кол-во удаляемых символов в этой строке
msg := RegexReplace(msg, "^(.*?\R){" a "}") ; удаляем начальные строки
b := b - a - 1 ; номер строки в которой будут удалятся символы изменился
msg := RegexReplace(msg, "^((?:.*?\R){" b "})[^\r\n]{0," c "}(\R?)", "$1$2") ; удаляем символы с заданной строки
msgbox % msg
Если я опять тебя не понял - учи русский язык, если понял правильно - учи регулярные выражения - они - сила великая!
Re: AHK: Регулярные выражения
mozers, Спасибо! То, что Вы не поняли моей формы изложения, вовсе не указывает на мой уровень знания языка. Что я сделал неправильно - изначально не привлек внимания к тому, что привел в вопросе случайные числа для практического примера, полагая, что это разумеющееся обстоятельство. Ведь сегодня мне может понадобиться удаление трех символов, а завтра уже четырех, например. А то, что для кого-то я остался непонятым даже после соответсвующих уточнений, наводит на другие проблемы, и не мои. Ну, а абсолютное незнание регулярных выражений - безусловно, моя проблема. Буду искать уроков с объяснением на пальцах, чтобы было понятно даже мне. А приводить предмет вопроса впредь постараюсь в форме, приближенной к Вашей.
Re: AHK: Регулярные выражения
becauseim, извини если был груб. Просто я сам обычно долго думаю над формулировкой вопроса (отвечаю гораздо быстрее). И, зачастую, пока думаешь и несколько раз переписываешь вопрос чтобы он звучал понятно для всех, решение само приходит в голову.
По поводу регулярных выражений: На этой страничке весьма скромная информация. В инете много более подробной и более легкой для понимания инфы.
Re: AHK: Регулярные выражения
becauseim, в русской справке расписаны только шаблоны по RegEx. Примеры с объяснением на пальцах смотрите в английском варианте: RegExMatch() и RegExReplace().
212 2017-05-18 07:13:09 (изменено: svoboden, 2017-05-18 07:18:47)
Re: AHK: Регулярные выражения
Там много (200 тыс.) букв, и все английские. Начинающим придётся попотеть с переводом.
Re: AHK: Регулярные выражения
а подскажите в AHK нормально работает жадность ? когда при "s" опции используешь .*?
у меня что-то с ними проблема. захватывает больше чем надо хотя должен остановится ? жадность то убрана.
на форуме это обсуждалось? или есть где статься об этом? в мануале все скудно об этом говорится. спасибо.
Re: AHK: Регулярные выражения
Если вы считаете, что реализация PCRE в AHK неправильная, где ваш, мать его, код?
Что я могу ответить на беспредметное нытье типа "у меня не работает"?
У меня все работает, если вам интересно. Помог надеюсь.
216 2017-05-19 15:24:09 (изменено: mustang, 2017-05-19 18:14:12)
Re: AHK: Регулярные выражения
Возможно дело и не в жадности, может регулярка у меня не правильная.
Мой код парсит html. Не буду его большой тут постить. Приведу пример попроще.
В примере по первому regex находит правильно, 2 варианта.
По второму - я жду от него тоже 2 варианта.
- 1.) "ok this is text 1" и пустое param
- 2.) "ok this is text 2" + "param 2"
... но тут он один раз находит "ok this is text 1" + "param 2"
и на этом закончил. Вот и не пойму куда копать.
В общем может быть много ok this is text 1 ok this is text 2 ok this is text 3 NNNN.... но param может быть, а может и не быть ... а все их надо по порядку перебрать и все сохранить.
string =
(
ok this is text 1 -----------
lost
lost
ok this is text 2 -----------
param 2
param 3
)
regex := "Ois)(?P<var_text>ok this is text \d+)"
for i,result in RxMatches(string, regex) {
MsgBox % "ver.1 = " . result.var_text
}
regex := "Ois)(?P<var_text>ok this is text \d+)(.+?param (?P<var_num>\d+))?"
for i,result in RxMatches(string, regex) {
MsgBox % "ver.2 = " . result.var_text . " ---- " . result.var_num
}
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FUNC - INIT
RxMatches(Haystack, Needle) {
Result := [] ;new MatchCollection()
start = 1
loop
{
if(!RegexMatch(haystack, needle, M, start))
break
Result.Insert(M)
start := M.Pos + M.Len
}
return Result
}
ExitApp
Re: AHK: Регулярные выражения
mustang, расставьте заглавные буквы и знаки препинания в своих сообщениях.
http://forum.script-coding.com/viewtopi … 55#p115655
http://forum.script-coding.com/viewtopi … 64#p115664
http://forum.script-coding.com/viewtopi … 37#p115937
http://forum.script-coding.com/viewtopi … 40#p115940
218 2017-05-19 19:16:37 (изменено: Malcev, 2017-05-19 19:17:45)
Re: AHK: Регулярные выражения
mustang, если в чем-то сомневаетесь, то проверяйте на простейшем примере:
var := "abcXYZ123123"
RegExMatch(var, "s)abc.*123", SubPat)
msgbox % SubPat
RegExMatch(var, "s)abc.*?123", SubPat)
msgbox % SubPat
Re: AHK: Регулярные выражения
ypppu, это да, если бы не было кнопки перевести эту страницу.
Re: AHK: Регулярные выражения
Если новичок поймёт машинный перевод, значит он не такой уж новичок.
Re: AHK: Регулярные выражения
Здравствуйте, имеется следующий текст:
[17:36:30] Max_Reelood[34] [тел: 454660]
[17:36:30] Sara_Kinoshita[81] [тел: 589941]
[17:36:30] Vadim_Ernestto[113] [тел: 901777]
[17:36:30] Brabus_Binjo[148] [тел: 55329]
[17:36:30] Dimas_Kozlov[252] [тел: 782006]
[17:36:30] Jek_Savage[278] [тел: 752324]
[17:36:30] Frank_Castello[371] [тел: 231541]
[17:36:30] Nekit_Joker[437] [тел: 819062]
[17:36:30] vasilia_harlamov[457] [тел: 499172]
[17:36:30] Andrey_Derix[564] [тел: 221539]
Количество подобных строк может быть разным: от нуля до бесконечности, время, имена, id (это цифра в [] сразу после имени), а так же номера телефонов могут быть разными, но точно известно, что каждый параметр, кроме времени, в одной строке, отличается от соответствующих параметров другой строки (т.е. не будет одинаковых id, имен или телефонов). Нужно вывести все id в массив, либо во внешний файл. Пока что мне пришла в голову идея отсекать переменные в RegExMatch, но у меня ничего не получилось. Пытался играться с break/continue - тоже ничего. Подскажите что можно сделать, предоставляю код, эта часть обязательно должна быть в поиске (сейчас она возвращает только один id).
log := {str:"",find:0,num:0} , log.str := []
Loop, read, %path_log%
log.str.Insert(A_LoopReadLine) ,log.num := A_Index
loop 50
if RegExMatch(log.str[log.num + 1 - A_Index],"\[(.*)\] (.*)_(.*)\[(.*)\] \[тел: (.*)\]", mn) and (log.find:=log.num + 1 - A_Index)
break
222 2017-06-30 20:37:41 (изменено: teadrinker, 2017-06-30 20:38:03)
Re: AHK: Регулярные выражения
text =
(
[17:36:30] Max_Reelood[34] [тел: 454660]
[17:36:30] Sara_Kinoshita[81] [тел: 589941]
[17:36:30] Vadim_Ernestto[113] [тел: 901777]
[17:36:30] Brabus_Binjo[148] [тел: 55329]
[17:36:30] Dimas_Kozlov[252] [тел: 782006]
[17:36:30] Jek_Savage[278] [тел: 752324]
[17:36:30] Frank_Castello[371] [тел: 231541]
[17:36:30] Nekit_Joker[437] [тел: 819062]
[17:36:30] vasilia_harlamov[457] [тел: 499172]
[17:36:30] Andrey_Derix[564] [тел: 221539]
)
arr := StrSplit( RegExReplace(text, "m`a)^\[.*?][^\[]+\[(\d+).*$", "$1"), "`n", "`r")
MsgBox, % arr[2]
223 2017-06-30 20:51:48 (изменено: belyankin12, 2017-06-30 20:52:33)
Re: AHK: Регулярные выражения
teadrinker, это понятно, только не все так гладко: изначально у меня нету переменной text (ну т.е. всех нужных мне строк сразу, они извлекаются через Loop по одной), потому извлечь со всех строк сразу вашим способом не получится. Последний код, который я привел в предыдущем сообщении, должен обязательно быть в решении, т.к. это единственный подходящий способ добычи строк из текстового файла в моем случае.
Re: AHK: Регулярные выражения
belyankin12, логика вашего кода мне непонятна. Что должно быть в ключах find и num? Почему именно Loop 50, а не 49, или 100500? И почему, наконец, нельзя считать всё содержимое файла в переменную сразу?
Re: AHK: Регулярные выражения
Loop 50 - это проверка 50 последних строк. А все что выше - это настройка чтения снизу вверх. А насчёт всего файла: можно и весь считать, как вам удобнее.
Re: AHK: Регулярные выражения
А нужно именно 50 последних сорок, и именно «снизу вверх»?
Re: AHK: Регулярные выражения
Да, именно снизу вверх и 50 строк, т.к. этот список мог пробиваться ранее и если читать больше строчек, то скрипт дойдет до устаревшего списка, определяя уже недействительные id.
Re: AHK: Регулярные выражения
FileRead, text, %path_log%
arr := []
Sort, text, F Reverse
Loop, parse, text, `n, `r
arr.Push( RegExReplace(A_LoopField, ".*\[(\d+)].*", "$1") )
until A_Index = 50
MsgBox, % arr[1]
Reverse(a1, a2, offset) {
return offset
}
Re: AHK: Регулярные выражения
teadrinker, отлично, это подходит, спасибо.
Re: AHK: Регулярные выражения
А вы обновляемый лог файл периодически читаете?
Win10x64 AhkSpy, Hotkey, ClockGui
231 2017-07-01 19:58:08 (изменено: teadrinker, 2017-07-01 20:09:32)
Re: AHK: Регулярные выражения
Ну да, конечно не обязательно читать лог каждый раз сначала, достаточно запомнить позицию его окончания при чтении, и в следующий раз переходить прямо к ней:
FilePath := A_Temp . "\test.log"
text =
(
[17:36:30] Max_Reelood[34] [тел: 454660]
[17:36:30] Sara_Kinoshita[81] [тел: 589941]
[17:36:30] Vadim_Ernestto[113] [тел: 901777]
[17:36:30] Brabus_Binjo[148] [тел: 55329]
[17:36:30] Dimas_Kozlov[252] [тел: 782006]
[17:36:30] Jek_Savage[278] [тел: 752324]
[17:36:30] Frank_Castello[371] [тел: 231541]
)
FileAppend, % text, % FilePath
oFile := FileOpen(FilePath, "r")
MsgBox,, Начальный текст, % oFile.Read()
pos := oFile.Pos
oFile.Close()
newText =
(
[17:36:30] Nekit_Joker[437] [тел: 819062]
[17:36:30] vasilia_harlamov[457] [тел: 499172]
[17:36:30] Andrey_Derix[564] [тел: 221539]
)
FileAppend, % newText, % FilePath
FileRead, text, % FilePath
MsgBox,, Полный текст файла с добавленными строками, % text
; но можно перейти сразу к последней запомненной позиции
oFile := FileOpen(FilePath, "r")
oFile.Pos := pos
; только новый текст с обрезанным переносом строки
MsgBox,, Только новый текст, % Trim(oFile.Read(), "`r`n")
oFile.Close()
FileDelete, % FilePath
Достаточно сохранять значение pos от предыдущего чтения.
Re: AHK: Регулярные выражения
Привет! С какой командой можно из первого получить второй вариант, — то есть, чтобы строки, начинающиеся на "F:\" копировались во все нижеследующие строки своей группы?
F:\eashp\c\exlibris\a\abashidze
<a href="p/t-abashidze-2652">
<a href="p/tamaz-abashidze-1254">
<a href="p/tamaz-abashidze-1252">
F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6915">
<a href="p/achttienribbe-p-6914">
<a href="p/achttienribbe-p-6913">
<a href="p/achttienribbe-p-6912">
<a href="p/p-achttienribbe-2230">
<a href="p/p-achttienribbe-2227">
<a href="p/p-achttienribbe-2224">
F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5760">
<a href="p/acket-d-5759">
<a href="p/acket-d-5758">
<a href="p/acket-d-5757">
<a href="p/acket-d-5755">
<a href="p/t-abashidze-2652">F:\eashp\c\exlibris\a\abashidze
<a href="p/tamaz-abashidze-1254">F:\eashp\c\exlibris\a\abashidze
<a href="p/tamaz-abashidze-1252">F:\eashp\c\exlibris\a\abashidze
<a href="p/achttienribbe-p-6915">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6914">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6913">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/achttienribbe-p-6912">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/p-achttienribbe-2230">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/p-achttienribbe-2227">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/p-achttienribbe-2224">F:\eashp\c\exlibris\a\achttienribbe
<a href="p/acket-d-5760">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5759">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5758">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5757">F:\eashp\c\exlibris\a\acket
<a href="p/acket-d-5755">F:\eashp\c\exlibris\a\acket
Re: AHK: Регулярные выражения
Как первый пример преобразовать во второй? —
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§50§linelinelinelinelineline
§50§linelinelinelinelinelineline
§50§linelinelinelinelinelineline
§50§linelinelinelinelinelineline
§52§linelinelinelinelineline
§52§linelinelinelinelinelineline
§52§linelinelinelinelinelineline
§52§linelinelinelinelinelineline
§line§linelinelinelinelineline
§line§linelinelinelinelinelineline
§line§linelinelinelinelinelineline
Re: AHK: Регулярные выражения
В одну строчку наверно никак.
235 2017-09-01 03:57:14 (изменено: stealzy, 2017-09-01 03:58:22)
Re: AHK: Регулярные выражения
DD, если ответите как заменить "§129§qwerty " на "§129§qwerty§129§ ", тогда дам вам готовый регексп.
teadrinker, в одну строчку, но прошу воздержаться.
236 2017-09-01 04:02:45 (изменено: DD, 2017-09-01 04:05:48)
Re: AHK: Регулярные выражения
teadrinker, подошло бы и не в одну строчку .
stealzy, так вроде: "^(§\d+§)(.*)$" на "$1$2$1".
237 2017-09-01 04:06:13 (изменено: stealzy, 2017-09-01 04:14:57)
Re: AHK: Регулярные выражения
Суть поймали, "(§\w+§)(\w+\r\n)(?!§)" на "$1$2$1", проверено в np++. Единственная фишка - отрицательная вперед смотрящая группа, чтобы не было лишних замен. Обозначения вперед/назад смотрящих групп я никак не запомню, просто знаю об их наличии, и когда нужно, смотрю шпоргалку.
Re: AHK: Регулярные выражения
teadrinker, в одну строчку
"(§\w+§)(\w+\r\n)(?!§)" на "$1$2$1", проверено в np++
Я чёт не уловил.
Re: AHK: Регулярные выражения
teadrinker, разве строчка не одна, или что имелось ввиду?
Re: AHK: Регулярные выражения
Строчка одна, а полностью код можно?
text =
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
MsgBox, А тут что?
241 2017-09-01 04:36:32 (изменено: DD, 2017-09-01 04:39:11)
Re: AHK: Регулярные выражения
Примерно по такому принципу я тоже делал, в Notepad++ команда работает, если выполнять по клавише строку за строкой, количество которых может доходить до трёх сотен, как в моём случае . Но если пробовать на AHK с циклом — вообще не фурычит:
text =
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
loop 10
text := RegexReplace(text, "(§\w+§)(.*?\n)(?!§)", "$1$2$1")
msgbox % text
UPD: А-а, не прав: дело было в концах строк, убрал \r и работает)). Спасибо!
Re: AHK: Регулярные выражения
Я думал, правда в одну строчку будет.
243 2017-09-01 04:49:39 (изменено: stealzy, 2017-09-01 04:53:35)
Re: AHK: Регулярные выражения
Если про строчку кода, то надо подумать. Увы вперед/назад смотрящие группы не поддерживают модификаторы в данной реализации, иначе бы получилось за один регекс.
DD, убирать \r некрасиво, потому что переносы всякие бывают.
v1.0.47.05+, \R can be restricted to CR, LF, and CRLF
str=
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
Loop {
str := new_str ? new_str : str
new_str := RegExReplace(str, "(§\w+§)(\w+\R)(?!§)", "$1$2$1")
} Until (str = new_str)
MsgBox % new_str
Re: AHK: Регулярные выражения
Лимит в строку для Regex — это правило какое-то?)) И возможна ли отрицательная вперед смотрящая группа не для одного символа, а для нескольких — тега, например?
Re: AHK: Регулярные выражения
Почему нет, вот только для содержимого внутри тегов такую группу не сделать в этой реализации.
246 2017-09-01 04:56:42 (изменено: DD, 2017-09-01 05:33:43)
Re: AHK: Регулярные выражения
Оказалось, что если изменить, как ниже — пустые или строки, следующие после строки с пробелом в группе, не затрагиваются:
str=
(
§50§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§52§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
§line§linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
Loop {
str := new_str ? new_str : str
new_str := RegExReplace(str, "s)(§\w+§)(\w+\R)(?!§|\R)", "$1$2$1")
} Until (str = new_str)
MsgBox % new_str
247 2017-09-01 04:58:08 (изменено: DD, 2017-09-01 04:58:31)
Re: AHK: Регулярные выражения
Почему нет
А какая это, я давно ищу?)) Даже в этой теме задавал вопрос)).
248 2017-09-01 05:06:45 (изменено: stealzy, 2017-09-01 05:12:50)
Re: AHK: Регулярные выражения
Так вот же выложил шпору, просто вставляете тег внутрь и все. Если захватываете содержимое между тегами, не забудьте ограничить жадность.
249 2017-09-01 05:15:23 (изменено: DD, 2017-09-01 05:16:18)
Re: AHK: Регулярные выражения
Это давняя мечта, спасибо!
250 2017-09-01 05:25:20 (изменено: DD, 2017-09-01 05:26:02)
Re: AHK: Регулярные выражения
Не пойму, почему <dd>50<dd> повторно появляется в нижней части вывода? —
str=
(
<dd>50<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
<dd>52<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
<dd>line<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
Loop {
str := new_str ? new_str : str
new_str := RegExReplace(str, "s)(<dd>\w+<dd>)(.*?\R)(?!<dd>)", "$1$2$1")
} Until (str = new_str)
MsgBox % new_str
251 2017-09-01 12:31:47 (изменено: stealzy, 2017-09-01 12:57:19)
Re: AHK: Регулярные выражения
Потому что шаблон .* включает в себя и знаки <>.
str=
(
<dd>50<dd>linelinelinelinelineline
linelinelinelinelinelineline
<dd>52<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
<dd>line<dd>linelinelinelinelineline
linelinelinelinelinelineline
linelinelinelinelinelineline
)
MsgBox % MultiRegExReplace(str, "(<dd>\w+<dd>)(\w*?\R+)(?!<dd>|\R)", "$1$2$1")
Return
; рекурсивная ф-ия, делающая замены, пока существуют подходящие под условия замены подстроки
MultiRegExReplace(str, regex, replacement) {
Return str = (next_str := RegExReplace(str, regex, replacement))
? str
: MultiRegExReplace(next_str, regex, replacement)
}
teadrinker, ф-ию в одну строку можно записать, если что .
Re: AHK: Регулярные выражения
А почему пример не обрабатывает строки с добавленными пробелами и т.д., даже если «\w*?» заменить на «.*»?
253 2017-09-01 15:50:00 (изменено: stealzy, 2017-09-01 15:51:44)
Re: AHK: Регулярные выражения
Прочитайте про кванторы и жадность, второй раз картинку выкладывать наверно не стоит.
Re: AHK: Регулярные выражения
teadrinker, ф-ию в одну строку можно записать, если что
В javascript разве что, но у нас AHK.
<dd>\w+<dd>
А что, между тегами могут быть только символы, подходящие под \w?
255 2017-09-01 15:58:02 (изменено: stealzy, 2017-09-01 16:02:47)
Re: AHK: Регулярные выражения
teadrinker, К.О.?
Очевидно подразумевались строки кода ф-ии, а не кол-во строк, которое занимает определение ф-ии целиком.
А что, между тегами могут быть только символы, подходящие под \w?
А ТЗ тут не вы диктуете, претензии не надо мне предъявлять... Более того, я скопировал эту часть из кода DD выше, думаю ему виднее.
Re: AHK: Регулярные выражения
stealzy, под "line" и имелась в виду строка, которая может включать любые символы. Касаемо жадности, если не путаю: так тоже не работает — .*?.
Re: AHK: Регулярные выражения
У меня работает:
str=
(
<dd>50<dd>lineli nelin elinelineline
linelinelinel inelinelineline
<dd>52<dd>linelinelinelinelineline
linelinelinelinelinelineli ne
linelinel inelinelinelineline
linelinelineline linelineline
linelinelinelineli nelineline
<dd>line<dd>linel inelinelinelineline
linelin elinelinelinelineline
linelinelinelinelinel ineline
)
MsgBox % MultiRegExReplace(str, "(<dd>\w+<dd>)(.*?\R+)(?!<dd>|\R)", "$1$2$1")
Return
; рекурсивная ф-ия, делающая замены, пока существуют подходящие под условия замены подстроки
MultiRegExReplace(str, regex, replacement) {
Return str = (next_str := RegExReplace(str, regex, replacement))
? str
: MultiRegExReplace(next_str, regex, replacement)
}
Re: AHK: Регулярные выражения
Очевидно подразумевались строки кода ф-ии, а не кол-во строк, которое занимает определение ф-ии целиком.
А какой в этом тогда смысл, не пойму? Я-то имел в виду решение, занимающее одну строчку кода. Да, по всей видимости К. О.
А ТЗ тут не вы диктуете, претензии не надо мне предъявлять
Я не заметил, где в ТЗ сказано про то, что между тегами могут быть только символы, соответствующие \w.
я скопировал эту часть из кода DD выше, думаю ему виднее
Так а он её скопировал из вашего прошлого кода. Если бы ему было виднее, он бы тут не задавал вопросы, а отвечал на них.
259 2017-09-01 16:09:19 (изменено: DD, 2017-09-01 16:09:40)
Re: AHK: Регулярные выражения
Так число "50" снова вклинивается после "52".
260 2017-09-01 16:11:30 (изменено: DD, 2017-09-01 16:16:41)
Re: AHK: Регулярные выражения
Если бы ему было виднее, он бы тут не задавал вопросы, а отвечал на них.
Виднее — в смысле ТЗ, а не решения. Строка подразумевалась без ограничений в отношении символов.
261 2017-09-01 16:16:20 (изменено: stealzy, 2017-09-01 16:19:09)
Re: AHK: Регулярные выражения
MultiRegExReplace(str, "(<dd>[^\n\r]+?<dd>)([^\n\r]+?\R+)(?!<dd>|\R)", "$1$2$1")
Ограничения все таки есть, раз символ переноса строки не подходит.
Конструкция [^\R] почему то отказывает.
Re: AHK: Регулярные выражения
Конструкция [^\R] почему то отказывает.
In v1.0.46.06+, \R means "any single newline of any type", namely those listed at the `a option (however, \R inside a character class is merely the letter "R").
https://autohotkey.com/docs/misc/RegEx-QuickRef.htm
Я подобные задачи решал через RegexMatch в цикле.
Re: AHK: Регулярные выражения
Кстати, код работает неверно (нет привязки к началу строки):
str=
(
test<dd>50<dd>lineli nelin elinelineline
linelinelinel inelinelineline
<dd>52<dd>linelinelinelinelineline
test<dd>50<dd>lineli nelin elinelineline
linelinelinel inelinelineline
)
msgbox % MultiRegExReplace(str, "(<dd>[^\n\r]+?<dd>)([^\n\r]+?\R+)(?!<dd>|\R)", "$1$2$1")
; рекурсивная ф-ия, делающая замены, пока существуют подходящие под условия замены подстроки
MultiRegExReplace(str, regex, replacement) {
Return str = (next_str := RegExReplace(str, regex, replacement))
? str
: MultiRegExReplace(next_str, regex, replacement)
}
Re: AHK: Регулярные выражения
По-моему, даже в том случае, когда работает, то работает не идеальным образом. Дело в том, что в цикле (или при рекурсии) текст каждый раз просматривается с самого начала, хотя в этом нет никакого смысла.
Re: AHK: Регулярные выражения
Интересно, возможен ли вариант не на RegEx? Потому что производительности не достаёт — на файле в 6 тысяч строк комп завис, хотя помимо других, стояла директива #MaxMem 400. Еще минут пять пытался процесс закрыть)). Не будет ли без RegEx быстрее?
Re: AHK: Регулярные выражения
Приведите пример файла.
267 2017-09-02 10:33:27 (изменено: stealzy, 2017-09-02 10:35:24)
Re: AHK: Регулярные выражения
Рекурсивные ф-ии жрут память, лучше переделать в цикл, а для ускорения избавиться от RegEx по всему содержимому файла.
Делайте цикл по строкам Loop, parse, FileContents, `n, `r, сохраняйте последний тег (извлекать его все еще можно RegEx-ом) и вставляйте в начало следующих строк, где тег не найден.
Re: AHK: Регулярные выражения
С каким шаблоном можно из первого варианта получить второй? —
^symbolssymbolssymbols27551,29397,29387,29367,29354symbolssymbolssymbols$
=27551
=29397
=29387
=29367
=29354
269 2018-03-16 20:01:42 (изменено: DD, 2018-03-16 20:11:18)
Re: AHK: Регулярные выражения
Можно ли это сделать, применив один шаблон?
Src =
(
symbolssymbolssymbols27551,29397,29387,29367,29354,29344,29328,29323,29317,29311,29303,29296,29267,29249,29237symbolssymbolssymbols
)
Src := RegExReplace(Src, "\D+", "`n=$1")
MsgBox, %Src%
Re: AHK: Регулярные выражения
Src =
(
symbolssymbolssymbols27551,29397,29387,29367,29354,29344,29328,29323,29317,29311,29303,29296,29267,29249,29237symbolssymbolssymbols
)
Src := RegExReplace(Src, "\D*(\d+)\D+", "=$1`n")
MsgBox, %Src%
271 2018-03-20 22:44:54 (изменено: DD, 2018-03-22 18:43:42)
Re: AHK: Регулярные выражения
272 2018-05-02 14:35:43 (изменено: DD, 2018-05-02 14:38:56)
Re: AHK: Регулярные выражения
«Пройдя мимо длинных рядов всяких товаров, я подошел к рабочим, медленно катившим нагруженный вагон. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили вагон до места и остановились, я подошел к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.»
Можно ли составить выражение, которое выделит в тексте указанные слова, находящиеся в любом порядке и на расстоянии не более чем 10 слов друг от друга? К примеру, эти: вагон\w+ подошел\w+?
Re: AHK: Регулярные выражения
Что вы понимаете под "вагон\w+"? Может быть "вагонов"?
274 2018-05-03 04:48:56 (изменено: DD, 2018-05-03 04:53:24)
Re: AHK: Регулярные выражения
Это я добавил на случай, если слова будут в падеже, с изменяемой частью: вагоны, вагонов и т.п. А слово "вагонов" — одиннадцатое по счёту и как бы не должно попасть в результат.
Re: AHK: Регулярные выражения
Не понял всё равно. Если задано "вагон", то нужно искать и "вагонов"?
Re: AHK: Регулярные выражения
Нужны любые формы слов "вагон" и "подошел", которые находятся друг от друга на расстоянии 10 слов.
Re: AHK: Регулярные выражения
А какие формы могут быть у слова "подошел\w+"?
278 2018-05-03 05:12:50 (изменено: DD, 2018-05-03 05:15:02)
Re: AHK: Регулярные выражения
Как уже сказал, это было предусмотрено на случай, если в словах окончания будут, чтобы они учитывались, чтобы затем мои правки не сделали шаблон нерабочим. То есть, находится слово "подошел" с неким возможным окончанием (как если бы оно могло быть), затем до десяти слов от слова "подошел". Первым в примере будет найден "вагон" без окончания — поэтому в этом месте поиск обрывается, найденное обрамляется (например) и продолжается новый поиск соответствий. Дальше идёт "вагонов", после которого нет слова "подошел" на заданном расстоянии, поэтому следующая пара будет найдена через несколько предложений. Схема такая:
подошел\w+ [до десяти слов] вагон\w+
вагон\w+ [до десяти слов] подошел\w+
Re: AHK: Регулярные выражения
А если первым найдено "подошел\w", то следующим должно быть "вагон\w", или может быть опять "подошел\w"?
Re: AHK: Регулярные выражения
Да, если первым найдено "подошел\w", то следующим должно быть "вагон\w" — и наоборот.
Re: AHK: Регулярные выражения
Боюсь, одним выражением такое недостижимо.
282 2018-05-03 12:22:39 (изменено: DD, 2018-05-03 12:23:02)
Re: AHK: Регулярные выражения
Недостижимо однократно найти от слова до слова в диапазоне десяти слов, — то есть, захватить слова
[подошел\w+|вагон\w+].*?[подошел\w+|вагон\w+]
и до десяти слов между ними? Это из-за возможной пунктуации между слов?
Re: AHK: Регулярные выражения
Не знаю, как указать что второе вхождение шаблона не должно соответствовать первому.
text =
(
Пройдя мимо длинных рядов всяких товаров, я подошел к рабочим, медленно подошел нагруженный вагон. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили вагон до места и остановились, я подошел к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.
)
while RegExMatch(text, "O)(*UCP)((подошел|вагон)\w*)(\W+\w+){1,10}?\W+(?1)(?=\W)", match, match ? match.Pos + match.Len : 1)
MsgBox, % match[0]
Хотя не исключаю, что это всё-таки как-то возможно, используя "Special Backtracking Control Verbs".
284 2018-05-04 11:25:02 (изменено: DD, 2018-05-04 11:26:08)
Re: AHK: Регулярные выражения
А возможен ли будет в рамках одного шаблона формат с перебором двух вариантов, прописанных через «|» — с поиском сначала «подошел ... вагон», а потом «вагон ... подошел»? Пробовал это на примере — не сработало.
285 2018-05-04 18:21:49 (изменено: DD, 2018-05-04 18:26:32)
Re: AHK: Регулярные выражения
Вот так вроде пошло, спасибо:
text =
(
Пройдя мимо длинных рядов всяких товаров, я _подошел к рабочим, медленно подошел нагруженный вагон_. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили _вагон до места и остановились, я подошел_ к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.
Пройдя мимо длинных рядов всяких товаров, я _подошел к рабочим, медленно подошел нагруженный вагон_. Передвижение на себе вагонов и очистку платформ от снега, как я узнал потом, рабочие обязаны делать бесплатно. Это стоит и в печатном условии. Рабочие были такие же оборванные и исхудалые, как и те, с которыми я говорил. Когда они докатили _вагон до места и остановились, я подошел_ к ним и спросил, когда они стали на работу и когда обедали. Мне ответили, что стали на работу в 7 часов, а обедали только сейчас. Так по работе надо было, не отпускали.
)
while RegExMatch(text, "O)(*UCP)(подошел\w*)(\W+\w+){1,10}?\W+(вагон\w*)|(вагон\w*)(\W+\w+){1,10}?\W+(подошел\w*)", match, match ? match.Pos + match.Len : 1)
MsgBox, % match[0]
А это в шаблоне перебор от одного до десяти слов? — «(\W+\w+){1,10}?\W+»?
Re: AHK: Регулярные выражения
Да.
Re: AHK: Регулярные выражения
Как задать шаблон для поиска одного или нескольких </div>, чтобы находились следующие варианты? —
...
</div></div></div></div></div>
</div></div></div></div>
</div></div></div>
</div></div>
</div>
Re: AHK: Регулярные выражения
В предыдущем ответе использовали же этот шаблон: {1,10}.
Re: AHK: Регулярные выражения
А как применять?
match4 =
(
</div></div></div></div>
)
match4 := RegExReplace(match4, "s)(</div>{1,10}?)", "«$1»")
MsgBox % match4
Re: AHK: Регулярные выражения
В справке же все написано:
{min,max}
Означает, что предыдущий элемент (символ, символ из перечня, или подшаблон) может быть повторен некоторое число раз.
В круглые скобки заключают группы элементов, чтобы:
Определить порядок оценивания. Например, стол(|а|у|ом|е) соответствует падежам слова стол.
Применять *, ?, +, и {min,max} к последовательности символов, а не к одному символу. Например, (пра)+ совпадает с повторяющейся приставкой "пра"; таким образом, находит "праправнук" и "прапрапрадед", но не находит "предок".
Выделить некоторый подшаблон, например точка-звездочка: abc(.*)xyz.
291 2018-05-14 10:26:13 (изменено: DD, 2018-05-14 23:01:07)
Re: AHK: Регулярные выражения
Пробовал по-всякому, не идет. Мне надо, чтобы в результате в кавычки обернулись все </div>, при том что в поиске будет указан — один </div>.
Re: AHK: Регулярные выражения
match4 := RegExReplace(match4, "s)(</div>{1,10}?)", "«$1»")
У вас {1,10} здесь к чему относится? Вопросительный знак что означает?
293 2018-05-14 22:50:53 (изменено: DD, 2018-05-14 22:55:09)
Re: AHK: Регулярные выражения
Это я в свете совета Malcev'а просто прикидывал. Так тоже не вытанцовывается —
match4 =
(
</div></div></div></div></div></p>
)
match4 := RegExReplace(match4, "s)([</div>]+)", "«$1»")
MsgBox % match4
Re: AHK: Регулярные выражения
Это легко проверить:
match4 =
(
<<<<<<<<#NoTrayIcon
)
match4 := RegExReplace(match4, "s)([</div>]+)", "«$1»")
MsgBox % match4
Re: AHK: Регулярные выражения
Или как я отредактировал в предыдущем посте... Но как же правильно?
Re: AHK: Регулярные выражения
Ни за что не поверю, что вы, имея уже столь значительный опыт использования RegEx, не сможете решить такую простую задачу.
Re: AHK: Регулярные выражения
DD, а зачем вы квадратные скобки используете?
var = aaaababbb
RegExMatch(var, "[ab]+", match)
MsgBox % match
RegExMatch(var, "(ab)+", match)
MsgBox % match
Re: AHK: Регулярные выражения
Ах вон оно как)). Спасибо!
Re: AHK: Регулярные выражения
Пробовал искать при помощи RegExMatch текст, заключённый между двумя тегами. Исходные данные брал из текстового файла.
RegExMatch(My_text, "<data>(.+?)</data>", match)
Result := match1
Всё получалось, пока размер файла был маленьким, до 1 мегабайта. Потом попробовал 30 мегабайт - уже ничего не получается - команда не находит соответствия шаблону, хотя я точно знаю что оно есть.
Существуют ли какие-то ограничения на размер исходника для RegExMatch?
Re: AHK: Регулярные выражения
Попробуй добавить s в опции (dot all).