1 (изменено: serzh82saratov, 2012-06-11 17:41:33)

Тема: AHK: Поиск и замена нескольких строк

Облазил всю справку, так и не понял как найти нескольких строк сразу то есть, есть XML, в нём секция

<keymap>
  <global>
    <keyboard>

пробовал

FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
IfInString, OutputVar, <keymap><global><keyboard>
или
IfInString, OutputVar, <keymap>`n<global>`n<keyboard>

ну и ещё много как пробовал, никак не выходит.
И как мне их заменить на свои несколько СТРОК , оставив всё что ниже и выше этого текста.
Наверно типа

StringReplace, OutputVar, OutputVar, <keymap><global><keyboard>, мой текст с перносом строк
FileDelete, C:\Users\sergey\Desktop\keyboard.xml
FileAppend, %OutputVar%, C:\Users\sergey\Desktop\keyboard.xml

Вообщем с переносом строк непонятно
Заранее спасибо за помощь

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2

Re: AHK: Поиск и замена нескольких строк

Если в составе искомой строки присутствует символ перехода на другую строку, попробуйте присвоить значение переменной следующим образом:

var = 
(
Идёт приём товара в секс-шопе.
- Вась!
- А!
- Х..й на!
)
MsgBox, %var%

3 (изменено: serzh82saratov, 2012-06-11 21:15:57)

Re: AHK: Поиск и замена нескольких строк

Спасибо, за ответ и анекдот.    Сделал так исходя из того что понял

FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
LoginScreen = 
(
<LoginScreen>
<keyboard>
)
StringReplace, OutputVar, OutputVar, %LoginScreen%, <LoginScreen>`n<keyboard>`n<!-- Create serzh82saratov -->
FileDelete, C:\Users\sergey\Desktop\keyboard.xml 
FileAppend, %OutputVar%, C:\Users\sergey\Desktop\keyboard.xml

В файле ничего не меняется
Попробовал просто поискать, пишет нет

FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
Var = 
(
<keymap>
<global>
)
IfInString, OutputVar, %Var%
{
StringReplace, OutputVar, OutputVar, %Var%, <LoginScreen>`n<keyboard>`n%A_Tab%%A_Tab%%A_Tab%%A_Tab%<!-- Create serzh82saratov -->
MsgBox %OutputVar%
}
Else
MsgBox нет

Подскажите что не так

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4

Re: AHK: Поиск и замена нескольких строк

Хех, попробовал сам, как посоветовал - не получилось.
Вот рабочий пример. Исходный текст файла:

Bla-bla-bla1
<LoginScreen>
<keyboard>
Bla-bla-bla2

После обработки:

Bla-bla-bla1
<LoginScreen>
<keyboard>
<!-- Create serzh82saratov -->
Bla-bla-bla2

Код скрипта:

;FileRead, OutputVar, Filename
;StringReplace, OutputVar, InputVar, SearchText [, ReplaceText, ReplaceAll?]
;FileAppend [, Text, Filename]


FileRead, FileContents, keyboard.txt

SearchText = <LoginScreen>`r`n<keyboard>

ReplaceText = <LoginScreen>`r`n<keyboard>`r`n<!-- Create serzh82saratov -->

StringReplace, OutputVar, FileContents, %SearchText%, %ReplaceText%
FileDelete, keyboard.txt
FileAppend, %OutputVar%, keyboard.txt

5 (изменено: serzh82saratov, 2012-06-11 22:02:19)

Re: AHK: Поиск и замена нескольких строк

Спасибо , работает. Но если например в keyboard.txt  перед словом <keyboard> стоит например два пробела, то это не сработает. Нужно писать уже не

SearchText = <LoginScreen>`r`n<keyboard>
  а  
SearchText = <LoginScreen>`r`n  <keyboard>
 или 
SearchText = <LoginScreen>`r`n%A_Space%%A_Space%<keyboard>

А так как количество пробелов перед "словами"  заранее не может быть известно, это мне не поможет.
И в идеале хотелось бы чтобы и такие случаи с коментариями

    <LoginScreen>            <!-- Create serzh82saratov -->
         <keyboard>              <!-- Create serzh82saratov -->

прокатывали

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

Re: AHK: Поиск и замена нескольких строк

Тогда Вам понадобятся шаблоны.
В русскоязычной справке изучите Регулярные выражения (RegEx) - краткий справочник , затем в англоязычной - RegExReplace() (с примерами).

7

Re: AHK: Поиск и замена нескольких строк

Буду учить, спасибо за наводку

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8

Re: AHK: Поиск и замена нескольких строк

Вообщем идеи кончились, максимум смог одолеть поиск одной строчки

SearchText := RegEx (<keymap>)

две строки никак, пробовал по разному один из вариантов

SearchText := RegEx ("m)<keymap>, `r`n<global>")

вроде похоже на примеры.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Поиск и замена нескольких строк

Наверное я усложняю себе задачу в XML есть секция

  <LoginScreen>
    <keyboard>

так вот <LoginScreen> может быть только один, но мне надо вставить строку после <keyboard>, может есть функция типа узнать номер строки где <LoginScreen>, прибавить 1, и переписать по номеру строки?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: Поиск и замена нескольких строк

Узнать номер строки, отвечающей шаблону, можно, перебирая файл по одной строке при помощи команды FileReadLine или Loop (чтение файла), либо IfInString.

11

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Вообщем идеи кончились, максимум смог одолеть поиск одной строчки

SearchText := RegEx (<keymap>)

две строки никак, пробовал по разному один из вариантов

SearchText := RegEx ("m)<keymap>, `r`n<global>")

вроде похоже на примеры.

Выражение "\s" соответствует любому пробельному символу, пример:

Str =
(
репа
дыня_арбуз
//===========
<keymap>
  <global>
    <keyboard>
//===========
	</keyboard>
  </global>
</keymap>
)
msgbox %str%
msgbox % RegExReplace(str, "<keymap>\s+<global>\s+<keyboard>", "вафля`nутюг")

12

Re: AHK: Поиск и замена нескольких строк

Чё-то я совсем туплю, хелп

FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
Sleep, 300
SearchText =
(
<keymap>
  <global>
    <keyboard>
)
Str = RegExReplace(SearchText, "<keymap>\s+<global>\s+<keyboard>", "вафля`nутюг")
StringReplace, OutputVar, OutputVar, %SearchText%, %Str%
FileDelete, C:\Users\sergey\Desktop\keyboard.xml
FileAppend, %OutputVar%, C:\Users\sergey\Desktop\keyboard.xml
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Чё-то я совсем туплю, хелп

наверно так:

FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
Str = RegExReplace(OutputVar, "<keymap>\s+<global>\s+<keyboard>", "вафля`nутюг")
FileDelete, C:\Users\sergey\Desktop\keyboard.xml
FileAppend, %OutputVar%, C:\Users\sergey\Desktop\keyboard.xml

14

Re: AHK: Поиск и замена нескольких строк

Александр_ пишет:
FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
Str = RegExReplace(OutputVar, "<keymap>\s+<global>\s+<keyboard>", "вафля`nутюг")
FileDelete, C:\Users\sergey\Desktop\keyboard.xml
FileAppend, %OutputVar%, C:\Users\sergey\Desktop\keyboard.xml

Ничего не меняет, и с переносом строк что делать.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:
Александр_ пишет:
FileRead, OutputVar, C:\Users\sergey\Desktop\keyboard.xml
Str = RegExReplace(OutputVar, "<keymap>\s+<global>\s+<keyboard>", "вафля`nутюг")
FileDelete, C:\Users\sergey\Desktop\keyboard.xml
FileAppend, %OutputVar%, C:\Users\sergey\Desktop\keyboard.xml

Ничего не меняет, и с переносом строк что делать.

Тут осталось две ошибки- синтаксическая и алгоритмическая. Найти их вам придётся самому.

16 (изменено: serzh82saratov, 2012-08-12 22:41:22)

Re: AHK: Поиск и замена нескольких строк

Неужели до меня дошло :fasepalm:

FileRead, keyboard, %A_ScriptDir%\keyboard.xml
Paste = <nine>999999999</nine>
Comment = Cоздано с помощью Keyboard_Editor
Section = global
Replace =
(
  <%Section%>
    <keyboard>
      %Paste%            <!--   %Comment%  -->
)
Search = <%Section%>\s+<keyboard>
Str := RegExReplace(keyboard, Search, Replace)

Да вот беда, перед записью нужно вывети список совпадений (если они есть (совпадение - часть переменной "Paste"(в данном случае "<nine>")))  в каждой секции. Секции имеют вид - в начале: <Имя секции> и следующей строкой <keyboard>, и конец секции:  </keyboard>

  <Section1>
    <keyboard>
       ......................
       ......................

       <nine>тряпка
       ......................
       ......................

    </keyboard>

  <Section2>
    <keyboard>
       ......................
       ......................

       <nine>веник
       ......................
       ......................

    </keyboard>

При этом если совпадение есть в той секции, в которую нужно произвести запись (в данном случае "global" (переменная "Section")) , то нужно вывести предупреждение, при согласии пользователя - удалить всю строку с совпадением, и только потом записать.
Для меня тяжёлая задачка... Помогите.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Александр_, 2012-08-13 01:53:13)

Re: AHK: Поиск и замена нескольких строк

FileText=
(
<Section1>
    <keyboard>
       ......................
       ......................

       <nine>тряпка</nine>
       ......................
       ......................

    </keyboard>
<секция два с половиной>
    <keyboard>
       ......................
       ......................

       <nine>ну просто нереально длинная строка</nine>
       ......................
       ......................

    </keyboard>

  <Section2>
    <keyboard>
       ......................
       ......................

       <nine>веник</nine>
       ......................
       ......................

    </keyboard>
) 
Pos := 1 ; символ, с которого начнётся поиск
i := 0 ; число найденных совпадений
loop
{
   Pos := RegExMatch(FileText, "<([^>]+)>\s+<keyboard>.*?</keyboard>", Result, Pos) ; ищем секцию
   if(Pos) ; если нашли
   {
	  IsValue := RegExMatch(FileText, "(?<=<nine>)(.*?)(?=</nine>)", Value, Pos) ; ищем нужный тег
	  if(IsValue) ; если нашли
	  {
	     i++
	     RegExMatch(Value, "^[^\r\n]{0,10}", PrintValue_%i%) ;выражение до первого перевода строки, но не более десяти символов
		 if(PrintValue_%i%!=Value) ; если выводим не полное значение
		    PrintValue_%i% .= "..." ; то дописываем три точки
		 Value_%i% := Value ; сохраняем найденное значение
		 Pos_%i% := IsValue ; сохраняем позицию
		 Gui, Add, Checkbox, vChexkBox_%i% Checked, % "секция """ Result1 """, значение """ PrintValue_%i% """" ; добавляем CheckBox
	  }
	  Pos += StrLen(Result) ; дальнейший поиск будем вести за этой секцией
   }
   else ; если не нашли
      break ; значит секций больше нет, выходим из цикла
}
if(!i) ; если ничего не нашли
   ExitApp ; то выходим
Gui, Add, Button, gReplace, Заменить ; добавляем кнопку
Gui, Show ; показываем окно
return

Replace:
   Gui, Submit ; узнать значения CheckBox'ов и спрятать окно
   loop %i% ; цикл по всем найденным значениям
   {
      j := i-a_index+1 ; заменять нужно с конца, иначе исказим найденные позиции
      if(ChexkBox_%j%) ; если галочка установлена
	     FileText := RegExReplace(FileText, Value_%j%, "999999999", "", 1, Pos_%j%) ; то заменить
   }
   msgbox %FileText%
   ExitApp
return

Esc::
GuiClose:
   ExitApp

18 (изменено: serzh82saratov, 2012-08-13 04:15:13)

Re: AHK: Поиск и замена нескольких строк

Ого. Вот это да! Красота! Всё что надо в десятке строк!
Ну и как всегда многое не понятно, за неимением сообразительности, и опыта с RegEx
эта строка отлично возвращает всё что между тегами, т.е. нужные мне "действия":
IsValue := RegExMatch(FileText, "(?<=<nine>)(.*?)(?=</nine>)", Value, Pos) ; ищем нужный тег
Непонятно как вместо <nine> и </nine> подставить свои переменные. (метод ненаучного тыка пока не дал результат)
по типу
Var1 = <a mod="ctrl,shift">
Var2 = </a>
Var3 = Window(Action)

IsValue := RegExMatch(FileText, "(?<=Var1)(.*?)(?=Var2)", Value, Pos)

и как переписать в итоге всю строку , т.е. не так <a mod="ctrl,shift">Window(Action)</a          <!--   Чужой коментарий  если он есть  -->
а так  <a mod="ctrl,shift">Window(Action)</a>          <!--   Мой коментарий  -->   ; Чужой коментарий удалён

3:54 13.08.2012
переписать всю строку это както видимо -  переписать всё что до `r`n

4:13 13.08.2012
ну вот ещё понял что засада может быть с тем что запись например <a mod="ctrl,alt,shift"> может иметь вид <a mod="alt,ctrl,shift"> или <a mod="shift,alt,ctrl"> или <a mod="shift,ctrl,alt"> или <a mod="ctrl,shift,alt">  из-за чего может не быть нужного совпадения.

OFF: возможные типы вариантов
<a>Window(Action)</a>
<a mod="ctrl,shift">Window(Action)</a>
<key id="713006">Window(Action)</key>

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

эта строка отлично возвращает всё что между тегами, т.е. нужные мне "действия":
IsValue := RegExMatch(FileText, "(?<=<nine>)(.*?)(?=</nine>)", Value, Pos) ; ищем нужный тег
Непонятно как вместо <nine> и </nine> подставить свои переменные. (метод ненаучного тыка пока не дал результат)
по типу
Var1 = <a mod="ctrl,shift">
Var2 = </a>
Var3 = Window(Action)

IsValue := RegExMatch(FileText, "(?<=Var1)(.*?)(?=Var2)", Value, Pos)

IsValue := RegExMatch(FileText, "(?<=" Var1 ")(.*?)(?=" Var2 ")", Value, Pos)

serzh82saratov пишет:

и как переписать в итоге всю строку , т.е. не так <a mod="ctrl,shift">Window(Action)</a          <!--   Чужой комментарий  если он есть  -->
а так  <a mod="ctrl,shift">Window(Action)</a>          <!--   Мой комментарий  -->   ; Чужой комментарий удалён

шаблон "(?<=<!--)(.*?)(?=-->)" соответствует любому тексту между "<!--" и "-->".

serzh82saratov пишет:

ну вот ещё понял что засада может быть с тем что запись например <a mod="ctrl,alt,shift"> может иметь вид <a mod="alt,ctrl,shift"> или <a mod="shift,alt,ctrl"> или <a mod="shift,ctrl,alt"> или <a mod="ctrl,shift,alt">  из-за чего может не быть нужного совпадения.

В шаблоне можно указать несколько вариантов- "alt|ctrl|delete" означает "alt" или "ctrl" или "delete".

20 (изменено: serzh82saratov, 2012-08-13 06:13:36)

Re: AHK: Поиск и замена нескольких строк

IsValue := RegExMatch(FileText, "(?<=" Var1 ")(.*?)(?=" Var2 ")", Value, Pos)

Спасибо. Так не пробовал.

шаблон "(?<=<!--)(.*?)(?=-->)" соответствует любому тексту между "<!--" и "-->".

а нет ли способа просто заменить всю строку на новую? Мне на будущее знать.

В шаблоне можно указать несколько вариантов- "alt|ctrl|delete" означает "alt" или "ctrl" или "delete".

разве это не станет совпадением с например shift,alt,ctrl,delete ?

Вертикальная черта разделяет варианты, между которыми можно выбирать. Совпадение принимается, если любой из альтернативных элементов совпадает. Например, gray|grey отвечает и gray, и grey

увидел странность по тэгам <a> </a> выдаёт очень много совпадений, хотя на самом деле их два.
по тэгам <a mod="ctrl,shift"> </a> находит совпадение, но не заменяет текст. Причём до этого просто вставлял как есть IsValue := RegExMatch(FileText, "(?<=<a mod="ctrl,shift">)(.*?)(?=</a>)", Value, Pos) ругалось на shift при запуске.

комментарий - упс

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

а нет ли способа просто заменить всю строку на новую? Мне на будущее знать.

Нужно всю строку сначала выделить, либо используя "\R" в шаблоне, либо перебором чрез "loop, parse".

serzh82saratov пишет:

разве это не станет совпадением с например shift,alt,ctrl,delete ?

Нет, в этой строке будет 3 совпадения. У нас 3 значения, соответственно 3!=6 вариантов перестановок. Нужно отдельно подготовить соответствующий подшаблон, либо вручную, либо сгенерировав программно. Генерация перестановок подробно и без привязки к языку рассмотрена во втором выпуске четвёртого тома "искусства программирования" Д. Кнута, раздел 7.2.1.1.

serzh82saratov пишет:

увидел странность по тэгам <a> </a> выдаёт очень много совпадений, хотя на самом деле их два. по тэгам <a mod="ctrl,shift"> </a> находит совпадение, но не заменяет текст.

А как искал/заменял?

serzh82saratov пишет:

Причём до этого просто вставлял как есть IsValue := RegExMatch(FileText, "(?<=<a mod="ctrl,shift">)(.*?)(?=</a>)", Value, Pos) ругалось на shift при запуске.

Вторым параметром должна быть одна строка, а не это конструкция "(?<=<a mod="ctrl,shift">)(.*?)(?=</a>)".

22 (изменено: serzh82saratov, 2012-08-13 17:47:36)

Re: AHK: Поиск и замена нескольких строк

Нужно всю строку сначала выделить, либо используя "\R" в шаблоне, либо перебором чрез "loop, parse".

не дошло

Вторым параметром должна быть одна строка, а не это конструкция "(?<=<a mod="ctrl,shift">)(.*?)(?=</a>)".

тоже не дошло, получилось это

Var1 = <a mod="
Var2 = shift|ctrl
FileRead, FileText, D:\keyboard.xml
Pos := 1 ; символ, с которого начнётся поиск
i := 0 ; число найденных совпадений
loop
{
   Pos := RegExMatch(FileText, "<([^>]+)>\s+<keyboard>.*?</keyboard>", Result, Pos) ; ищем секцию
   if(Pos) ; если нашли
   {
; IsValue := RegExMatch(FileText, "(?<=" Var1 ")(.*?)(?=" Var2 ")", Value, Pos)

IsValue := RegExMatch(FileText, "(?<=" Var1 ")(?=" Var2 ")", Value, Pos)
      if(IsValue) ; если нашли
      {

совпадает и с <a mod="ctrl"> и с <a mod="ctrl,shift,alt">. Наверно не хватает какой то опции типа все совпадения. Чтение рус. справки RegExMatch не дало ответ.
Далее видимо нужно "взять" из этой строки чтобы получить нужное"действие", просто всё  что между > и </

RegExMatch(FileText, "(?<=>)(.*?)(?=</)", Value, Pos)

пока пытаюсь это вставить в код...

увидел странность по тэгам <a> </a> выдаёт очень много совпадений, хотя на самом деле их два. по тэгам <a mod="ctrl,shift"> </a> находит совпадение, но не заменяет текст.

А как искал/заменял?

Всё также как и с "<nine>" сначала путём подстановки переменной, потом пробовал непосредственно вставлять в шаблон. Ошибки быть не может подставляю <nine>, и всё правильно находит и заменяет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Поиск и замена нескольких строк

serzh82saratov, шаблон- это строка, а в большинстве языков(включая AHK) символом начала строки является кавычка и она же является символом окончания строки. Т.е. строка- это то, что между кавычками. Т.е. в выражении "(?<=<a mod="ctrl,shift">)(.*?)(?=</a>)" кавычка на первой позиции говорит транслятору, что строка началась, а кавычка на 14-ой позиции, что строка закончилась. Чтобы использовать кавычку внутри строки её нужно экранировать второй кавычкой. Т.е. так "(?<=<a mod=""ctrl,shift"">)(.*?)(?=</a>)".
Далее шаблон "(?<=<a mod="")(?=shift|ctrl)" вообще пустой. (?<=шаблон)- это запрос назад, он не включается в найденный шаблон, так же как и запрос вперёд (?=шаблон). Запросы вперёд и назад используются при поиске, но не включаются в ответ.
Что касается поиска перечисления клавиш типа "ctrl,shift,alt", то я бы не искал точное совпадение, я бы искал примерное, а затем уточнял. Например, если мне нужно найти перечень клавиш ctrl, alt и shift в любом порядке через запятую, то я упрощу шаблон до "[ctrlashif,]{14,14}", а потом найденные подшаблоны проверю ещё раз для получения точного результата. Не нужно стараться всё впихнуть в одно действие.

24 (изменено: serzh82saratov, 2012-08-14 11:14:29)

Re: AHK: Поиск и замена нескольких строк

Спасибо, многое становится ясно.

Удалено: разобрался

Так и не понял как использовать "\R" чтоб заменить всю строку.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25 (изменено: serzh82saratov, 2012-08-14 12:11:59)

Re: AHK: Поиск и замена нескольких строк

Мдаа. Вроде только разобрался с большинством своих глупых вопросов, и тут на тебе. Ещё час назад всё было нормально, и тут перезаписываю 1 раз файл, во второй раз не находит секцию, в переменную весь текст считывается. Оказалось что помогает только копирование с заменой файла XML. При этом скрипт перезапускать не надо. Потом выяснилось что после перезаписи, надо каждый раз менять кодировку XML на ANSI. Ну подумал что AutoHotkey версии 1.1.08.00 Ansi 32 не катит, переставил его на Ansi 64, потом Unicode 32, тот сюрприз выдал, скрипт что был открыт в Notepad++ во время переустановки безвозвратно поменял всю кирилицу на крякозябры. Откатил на Ansi 32.
Буковки то я перепишу, а вот что же с  XML-ём то делать...Вся работа коту под хвост.

11:16 14.08.2012
Теперь и изменение кодировки XML на ANSI перестало помогать, проклятье какое то

11:56 14.08.2012
С ctrl,shift придумал извращённое решение (всё равно CheckBox-ы проверять)

StringReplace, qCtrl, Ctrl, 1 , 4
StringReplace, qAlt, Alt, 1 , 3
StringReplace, qShift, Shift, 1 , 5
mod := (Ctrl+Shift+Alt)+(qCtrl+qShift+qAlt-1)

RegExMatch(Length, "P)(?<=="")(.*?)(?="">)", Value, 1)
StringReplace, Value, Value, %A_Space%, , All
if Value = mod

с шаблоном пока никак...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26 (изменено: Александр_, 2012-08-14 23:59:27)

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Так и не понял как использовать "\R" чтоб заменить всю строку.

ищем строку содержащую подстроку "ahk":

Value := "fgjgjg`nreytey`nseahkser`nrdgdg"
msgbox %Value%
RegExMatch(Value, "[^\r\n]*ahk.*?\R", PrintValue)
msgbox %PrintValue%
serzh82saratov пишет:

Ещё час назад всё было нормально, и тут перезаписываю 1 раз файл, во второй раз не находит секцию, в переменную весь текст считывается. Оказалось что помогает только копирование с заменой файла XML. При этом скрипт перезапускать не надо. Потом выяснилось что после перезаписи, надо каждый раз менять кодировку XML на ANSI. Ну подумал что AutoHotkey версии 1.1.08.00 Ansi 32 не катит, переставил его на Ansi 64, потом Unicode 32, тот сюрприз выдал, скрипт что был открыт в Notepad++ во время переустановки безвозвратно поменял всю кирилицу на крякозябры. Откатил на Ansi 32.
Буковки то я перепишу, а вот что же с  XML-ём то делать...Вся работа коту под хвост.

Ничего не понял. Напиши что дано и что нужно получить.

27

Re: AHK: Поиск и замена нескольких строк

Александр_ пишет:
Value := "fgjgjg`nreytey`nseahkser`nrdgdg"
msgbox %Value%
RegExMatch(Value, "[^\r\n]*ahk.*?\R", PrintValue)
msgbox %PrintValue%

Можно попроще:

Value := "fgjgjg`nreytey`nseahkser`nrdgdg"
msgbox %Value%
RegExMatch(Value, "m`a).*ahk.*", PrintValue)
msgbox %PrintValue%
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28 (изменено: serzh82saratov, 2012-08-15 04:33:28)

Re: AHK: Поиск и замена нескольких строк

Ничего не понял. Напиши что дано и что нужно получить.

Имеется xml файл с подобным текстом. Если я делаю один раз запись в этот файл, то при следующей записи, пишет секция не найдена. Пока файл не заменю на новый отказывается находить секцию. Запись производится не понятно как, т.е. находит что надо заменить, но может не переписать, может нормально записать, может записать рядом (но не с метки ReplaceNew). Для одной и той же строки, один и тот же код, всегда по разному.

  Path = D:\keyboard.xml
  ; FileRead, keyboard, %Path%
keyboard =
(
<keymap>
  <global>
    <keyboard>
	<q mod="ctrl,shift">Window(1)</q>
	<r mod="ctrl,shift">Window(2)</r>
	<a mod="ctrl,shift,alt">Window(3)</a>
	<a mod="alt">Window(4)</a>
	<a mod="shift">Window(5)</a>
	<a mod="ctrl">Window(6)</a>
	<a mod="shift,alt">Window(7)</a>
	<a mod="ctrl,shift">Window(8)</a>
  </global>
  <Home>
    <keyboard>
	<q mod="ctrl,shift">Window(12)</q>
	<r mod="ctrl,shift">Window(22)</r>
	<a mod="ctrl,shift,alt">Window(32)</a>
	<a mod="alt">Window(42)</a>
	<a mod="shift">Window(52)</a>
	<a mod="ctrl">Window(62)</a>
	<a mod="shift,alt">Window(72)</a>
	<a mod="ctrl,shift">Window(82)</a>
    </keyboard>
  </Home>
  )
ModKey := 10 
MyKey = a
Action =  такой
Section = global
ModText = ctrl+shift+%MyKey%
ModPref = ctrl,shift
Replace = <%MyKey% mod="%ModPref%">%Action%</%MyKey%>
Pos := 1
Pos := RegExMatch(keyboard,"<" Section ">.\s+<keyboard>", Result, Pos) ; ищем секцию
if(Pos)
loop
{
     IsValue := RegExMatch(keyboard, "<" MyKey " mod="".*?</" MyKey ">", Length, Pos) ; ищем похожую строку
     if(IsValue) ; если нашли
     { 
     RegExMatch(Length, "P)(?<=mod="")(.*?)(?="">)", Pmod, 1) ; ищем шаблон, и вычисляем кол-во символов
	 if Pmod = %ModKey% ; если кол-во символов совпадает 
              {
	 RegExMatch(Length, "(?<="">)(.*?)(?=</" MyKey ">)", CurAct, 1) ; всё совпало, выводим название действия
	 MsgBox, 36,, "%ModText%" в секции `r "%Section%"`r уже было назначено для`r "%CurAct%",`r  Перезаписать?
	 IfMsgBox No                                        
               return
               else 
	 keyboard := RegExReplace(keyboard, Length, Replace, "", 1)
	 FileDelete, %Path%
               FileAppend, %keyboard%, %Path%
	 MsgBox В секции "%Section%" для "%ModText%" назначено "%Action%"
	 Return
	 } 
	 Pos += StrLen(Length) ; если кол-во символов не совпадает, повторяем со следущей строки
	 }  
	 else
	 Gosub, ReplaceNew ; совпадений больше нет, идём делать запись вверху секции.
}  	 
MsgBox Секция "%Section%" не найдена
Return
ReplaceNew:
MsgBox Сделать новую запись?
Paste =
(
  <%Section%>
    <keyboard>
      %Replace%     
)   ;    <!--   %Comment%  -->
Search = <%Section%>\s+<keyboard>
keyboard := RegExReplace( keyboard, Search, Paste)
FileDelete, %Path%
FileAppend, %keyboard%, %Path%
MsgBox В секции "%Section%" для "%MyKey%" назначено "%Action%"
return

Ещё вопрос как заканчивать поиск только в заданной секции?

4:26 15.08.2012
Вроде понял почему не писало, нужно записывать в Binary mode.
4:33 15.08.2012
Всё равно не стабильно...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

29

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Имеется xml файл с подобным текстом. Если я делаю один раз запись в этот файл, то при следующей записи, пишет секция не найдена. Пока файл не заменю на новый отказывается находить секцию. Запись производится не понятно как, т.е. находит что надо заменить, но может не переписать, может нормально записать, может записать рядом (но не с метки ReplaceNew). Для одной и той же строки, один и тот же код, всегда по разному.
...
Ещё вопрос как заканчивать поиск только в заданной секции?/global

У меня в 17-ом посту ошибка, поиск должен вестись в переменной Result.

Pos := RegExMatch(FileText, "<([^>]+)>\s+<keyboard>.*?</keyboard>", Result, Pos) ; ищем секцию

После выполнения будет:
Pos- позиция символа с которого найденный начинается шаблон.
Result- сам шаблон, а в данном случае это секция.
Что касается изменения файла- скорее всего там что-то ищется в одной строке, а заменяется в другой. Точно не скажу, т.к. там ошибка уже в первом вызове:

Pos := RegExMatch(keyboard,"<" Section ">.\s+<keyboard>", Result, Pos) ; ищем секцию

Это можно считать нахождением начала секции, да и то неверным. Например строка "<global>Ы <keyboard>" соответствует шаблону. Всю секцию нужно выделять так:

Pos := RegExMatch(keyboard,"<" Section ">\s+<keyboard>.*?</" Section ">", Result, Pos)

30 (изменено: serzh82saratov, 2012-08-15 04:55:48)

Re: AHK: Поиск и замена нескольких строк

Ещё не понятно почему часто не хочет заменять. Записываю keyboard := RegExReplace(keyboard, Length, Replace, "", 1),
Смотрю MsgBox %keyboard%, а изменений нет даже в сообщении...

Что касается изменения файла- скорее всего там что-то ищется в одной строке, а заменяется в другой. Точно не скажу, т.к. там ошибка уже в первом вызове:

Имею ввиду что даже в MsgBox %keyboard% нет изменений.

скорее всего там что-то ищется в одной строке, а заменяется в другой

Новых строк не появляется. Это точно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31 (изменено: serzh82saratov, 2012-08-15 05:19:10)

Re: AHK: Поиск и замена нескольких строк

Смотрю MsgBox %keyboard%, а изменений нет даже в сообщении...

Выяснил что из Replace = <%MyKey% mod="%ModPref%">"%Action%"</%MyKey%> переписывается только ModPref, MyKey и Action не изменяются, в заменяемой строке, MsgBox-е

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

скорее всего там что-то ищется в одной строке, а заменяется в другой

Новых строк не появляется. Это точно.

из поста #28:

IsValue := RegExMatch(keyboard, "<" MyKey " mod="".*?</" MyKey ">", Length, Pos)
...
keyboard := RegExReplace(keyboard, Length, Replace, "", 1)

Т.е. при Pos!=1 поиск и замена производятся в разных строках.

33 (изменено: serzh82saratov, 2012-08-15 10:10:39)

Re: AHK: Поиск и замена нескольких строк


Pos := RegExMatch(keyboard,"<" Section ">\s+<keyboard>.*?</" Section ">", Result, Pos)
if(Pos)
loop
{
     IsValue := RegExMatch(Result, "<" MyKey " mod="".*?</" MyKey ">", Length, Pos) ; ищем похожую строку
     if(IsValue) ; если нашли
     {
     RegExMatch(Length, "P)(?<=mod="")(.*?)(?="">)", Pmod, 1) ; ищем шаблон, и вычисляем кол-во символов
	 if Pmod = %ModKey% ; если кол-во символов совпадает
	 {
	 RegExMatch(Length, "(?<="">)(.*?)(?=</" MyKey ">)", CurAct, 1) ; если всё совпало, выводим название действия
	 MsgBox, 36,, "%ModText%" в секции `r "%Section%"`r уже было назначено для`r "%CurAct%",`r  Перезаписать?
	 IfMsgBox No                                        
     return
     else 
	 	 MsgBox %Replace% %Length%
	 keyboard := RegExReplace(keyboard, Length, Replace)
	 FileDelete, %Path%
     FileAppend, %keyboard%, *%Path%
	 MsgBox %keyboard%
	 MsgBox В секции "%Section%" для "%ModText%" назначено "%Action%"
	 Return
	 } 
	 Pos += StrLen(Length) ; если кол-во символов не совпадает, повторяем со следущей строки
	 }  
	 else
	 Gosub, ReplaceNew
}  	 
MsgBox Секция "%Section%" не найдена
Return

Переделал. Теперь ищет только в нужной секции.
Но вот что с Replace не так...

Выяснил что из Replace = <%MyKey% mod="%ModPref%">"%Action%"</%MyKey%> переписывается только ModPref.
MyKey и Action не изменяются, в заменяемой строке, и в MsgBox-е не видно

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

34 (изменено: serzh82saratov, 2012-08-15 14:39:13)

Re: AHK: Поиск и замена нескольких строк

keyboard = <a mod="ctrl">Window(ctrl)</a>	 
Replace = 12345
Length  = <a mod="ctrl">Window(ctrl)</a>
keyboard := RegExReplace(keyboard, Length, Replace, "", 1, 1 )
MsgBox %keyboard%
Return

Господа объясните почему в данном варианте можно что-то заменить только если как минимум Length  = <a mod="ctrl">Window

14:31 15.08.2012

Попробовал перед записью добавить RegExMatch раз уж \R должен заменить всю строку, в PrintValue строка отображается нужная, но замены снова нет. Она же подтверждает видимо, правильность "позиции" (Pos) замены.

	 RegExMatch(keyboard, "[^\r\n]*<* mod=.*?\R", PrintValue, Pos)
	 keyboard := RegExReplace(keyboard, PrintValue, Replace, "", 1, Pos )
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

35

Re: AHK: Поиск и замена нескольких строк

keyboard =
(
<keymap>
  <global>
    <keyboard>
    <q mod="ctrl,shift">Window(1)</q>
    <r mod="ctrl,shift">Window(2)</r>
    <a mod="ctrl,shift,alt">Window(3)</a>
    <a mod="alt">Window(4)</a>
    <a mod="shift">Window(5)</a>
    <a mod="ctrl">Window(6)</a>
    <a mod="shift,alt">Window(7)</a>
    <a mod="ctrl,shift">Window(8)</a>
  </global>
  <Home>
    <keyboard>
    <q mod="ctrl,shift">Window(12)</q>
    <r mod="ctrl,shift">Window(22)</r>
    <a mod="ctrl,shift,alt">Window(32)</a>
    <a mod="alt">Window(42)</a>
    <a mod="shift">Window(52)</a>
    <a mod="ctrl">Window(62)</a>
    <a mod="shift,alt">Window(72)</a>
    <a mod="ctrl,shift">Window(82)</a>
    </keyboard>
  </Home>
  )
ModKey := 10 
MyKey = a
Action =  такой
Section = global
ModText = ctrl+shift+%MyKey%
ModPref = ctrl,shift
Replace = <%MyKey% mod="%ModPref%">%Action%</%MyKey%>
CtrlShift := "(?:ctrl,shift|shift,ctrl)"
Pos := RegExMatch(keyboard,"<" Section ">\s+<keyboard>.*?</" Section ">", SectionText, 1) ; ищем секцию
if(Pos)
{
   TagPos := RegExMatch(SectionText, "<" MyKey " mod=""" CtrlShift """>(.*?)</" MyKey ">", TagText) ; ищем тэг в секции
   if(TagPos) ; если нашли
   {
      MsgBox, 36,, "%ModText%" в секции `r "%Section%"`r уже было назначено для`r "%TagText1%",`r  Перезаписать?
	  IfMsgBox Yes
	     keyboard := SubStr(keyboard, 1, Pos+TagPos-2) . Replace . SubStr(keyboard, Pos+TagPos-1+StrLen(TagText)) ; перезаписываем во всём файле
	  else 
	     return
	  MsgBox В секции "%Section%" для "%ModText%" назначено "%Action%"
   }
   else
      MsgBox совпадений нет
}
else    
   MsgBox Секция "%Section%" не найдена
return
serzh82saratov пишет:

Господа объясните почему в данном варианте можно что-то заменить только если как минимум Length  = <a mod="ctrl">Window

Не понял вопроса, но замена не происходит из-за того, что скобки являются управляющими конструкциями, чтобы использовать их как обычный символ, нужно экранировать обратным слешем(Length  = <a mod="ctrl">Window\(ctrl\)</a>).

36 (изменено: serzh82saratov, 2012-08-15 21:41:46)

Re: AHK: Поиск и замена нескольких строк

Никак под себя не могу переделать код. Как не перезаписывать во всём файле, а только в секции, и как для этого позицию вычислять. CtrlShift понятно, а как с остальными, тоже надо все варианты перебирать и заранее определять какой из них нужен. Откуда берётся %TagText1%.
Ужасно тяжело до меня доходит с этим RegEx

И снова как всю строку удалить, теперь это не находит строку
TagPos := RegExMatch(SectionText, "[^\r\n]<" MyKey " mod=""" CtrlShift """>(.*?)</" MyKey ">\R", TagText)
А это находит , но не заменяет всю строку
TagPos := RegExMatch(SectionText, "m`a)<" MyKey " mod=""" CtrlShift """>(.*?)</" MyKey ">", TagText)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

37

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Как не перезаписывать во всём файле, а только в секции, и как для этого позицию вычислять.

файл в любом случае придётся перезаписывать.

serzh82saratov пишет:

CtrlShift понятно, а как с остальными, тоже надо все варианты перебирать и заранее определять какой из них нужен.

Или перебор, или довольствоваться приближёнными методами.

serzh82saratov пишет:

Откуда берётся %TagText1%.

TagText- это весь шаблон, а TagText1- это первый подшаблон. Подшаблон- это то, что в скобочках.

serzh82saratov пишет:

И снова как всю строку удалить, теперь это не находит строку
TagPos := RegExMatch(SectionText, "[^\r\n]<" MyKey " mod=""" CtrlShift """>(.*?)</" MyKey ">\R", TagText)
А это находит , но не заменяет всю строку
TagPos := RegExMatch(SectionText, "m`a)<" MyKey " mod=""" CtrlShift """>(.*?)</" MyKey ">", TagText)

RegExMatch ничего не заменяет, только ищет. Если не находит, значит после закрытия тега ещё символы есть, например пробел или табуляция.

38 (изменено: serzh82saratov, 2012-08-16 00:06:46)

Re: AHK: Поиск и замена нескольких строк

RegExMatch ничего не заменяет, только ищет. Если не находит, значит после закрытия тега ещё символы есть, например пробел или табуляция.

Снова я так не так понял

Нужно всю строку сначала выделить, либо используя "\R" в шаблоне

ищем строку содержащую подстроку "ahk":
Код (AutoHotKey):
Value := "fgjgjg`nreytey`nseahkser`nrdgdg"
msgbox %Value%
RegExMatch(Value, "[^\r\n]*ahk.*?\R", PrintValue)

файл в любом случае придётся перезаписывать.

Я про то что снова у меня путаница, раньше  только в секции запись была, или строка вся заменялась. Стоит что то внести в код, и что нибудь не работает. Не могу собрать всё что вы мне расскали во едино.
Нужно 1 ищем секцию. 2 ищем <" MyKey " mod="".*?</" MyKey ">" только в этой секции. 3 удаляем в ней все пробелы (можно вместе с запятыми) чтоб кол-во символов точно совпало. 4  в ней ищем шаблон, и вычисляем кол-во символов (?<=mod="")(.*?)(?="">)", Pmod, 1). 5  удаляем в заменяемой строке все ()/\[]{} и остальные символы не дающие перезапись. 6 Переписываем всю строку до конца, только в этой секции.

Или перебор, или довольствоваться приближёнными методами.

Может можно сделать чтоб в строке были только нужные символы. по типу выделяем (?<=mod="")(.*?)(?="">) получаем ctrl,shift удаляем запятые, и пробелы ctrlshift . В условии поиска назначено Search = %shift%%ctrl%%alt%, при этом переменая alt пустая.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

39

Re: AHK: Поиск и замена нескольких строк

попробуем процедурное программирование:

keyboard =
(
<keymap>
  <global>
    <keyboard>
    <q mod="ctrl,shift">Window(1)</q>
    <r mod="ctrl,shift">Window(2)</r>
    <a mod="ctrl,shift,alt">Window(3)</a>
    <a mod="alt">Window(4)</a>
    <a mod="shift">Window(5)</a>
    <a mod="ctrl">Window(6)</a>
    <a mod="shift,alt">Window(7)</a>
    <a mod="ctrl,shift">Window(8)</a>
  </global>
  <Home>
    <keyboard>
    <q mod="ctrl,shift">Window(12)</q>
    <r mod="ctrl,shift">Window(22)</r>
    <a mod="ctrl,shift,alt">Window(32)</a>
    <a mod="alt">Window(42)</a>
    <a mod="shift">Window(52)</a>
    <a mod="ctrl">Window(62)</a>
    <a mod="shift,alt">Window(72)</a>
    <a mod="ctrl,shift">Window(82)</a>
    </keyboard>
  </Home>
)
MyKey := "a"
Action := "такой"
Section := "global"
Replace = <%MyKey% mod="%ModPref%">%Action%</%MyKey%>
Pos := GetSection(keyboard, Section, Content) ; ищем секцию
if(Pos)
{
   ;TagPos := GetTagLines(Content, MyKey, TagText, "[ctrl,shif ]{10,}") ; с модификаторами ctrl+shift, не точное решение
   TagPos := GetTagLines(Content, MyKey, TagText) ; с любыми модификаторами
   if(TagPos[1]) ; если нашли
   {
      msgbox % ReplaceTagContent(keyboard, Pos+TagPos[3]-2, StrLen(TagText[3]), Action) ; замена действия
	  msgbox % DeleteTag(keyboard, Pos+TagPos[1]-2, StrLen(TagText[1])) ; удаление тега
   }
   else
      MsgBox подходящих тегов нет
}
else    
   MsgBox Секция "%Section%" не найдена
ExitApp

; нахождение секции по её имени
; Text- текст, в котором надо искать
; SectionName- имя секции, входной параметр
; Content- содержимое секции, выходной параметр
; возвращает позицию первого символа из шаблона
GetSection(Text, SectionName, ByRef Content)
{
   return RegExMatch(Text, "<" SectionName ">\s+<keyboard>.*?</" SectionName ">", Content, 1)
}

; нахождение тега по его имени
; Text- текст, в котором надо искать
; TagName- имя тега, входной параметр
; Content- содержимое секции, выходной параметр
; Content[1]- тег плюс табуляции и пробелы до него и табуляции, пробелы и один перевод строки после
; Content[2]- модификаторы
; Content[3]- содержимое тега
; возвращает позицию первого символа из шаблона
; modTemplate- шаблон, которому должны соответствовать модификаторы
; возвращает массив с позициями первых символов шаблона и подшаблонов, похож на параметр Content.
GetTagLines(Text, TagName, ByRef Content, modTemplate = ".*?")
{
   ret := RegExMatch(Text, "P)[\t ]*<" TagName " mod=""(?P<Templ>" modTemplate ")"">(?P<Cont>.*?)</" TagName ">[\t ]*\R", Result)
   Content := [SubStr(Text, ret, Result), SubStr(Text, ResultPosTempl, ResultTempl), SubStr(Text, ResultPosCont, ResultLenCont)]
   return [ret, ResultPosTempl, ResultPosCont]
}

; замена содержимого тега
; Text- текст, в котором надо заменять
; StartPosition- начало подстроки, которую надо заменить
; Length- длина подстроки, которую надо заменить
; NewContent- строка на которую надо заменить подстроку
ReplaceTagContent(Text, StartPosition, Length, NewContent)
{
   return SubStr(Text, 1, StartPosition) . NewContent . SubStr(Text, StartPosition+Length+1)
}

; удаление тега
; Text- текст, в котором надо удалить
; StartPosition- начало подстроки, которую надо удалить
; Length- длина подстроки, которую надо удалить
DeleteTag(Text, StartPosition, Length)
{
   return SubStr(Text, 1, StartPosition) . SubStr(Text, StartPosition+Length+1)
}
serzh82saratov пишет:

Или перебор, или довольствоваться приближёнными методами.

Может можно сделать чтоб в строке были только нужные символы. по типу выделяем (?<=mod="")(.*?)(?="">) получаем ctrl,shift удаляем запятые, и пробелы ctrlshift . В условии поиска назначено Search = %shift%%ctrl%%alt%, при этом переменая alt пустая.

лучше искать как в примере выше, а то, что нашли дополнительно проверять своей функцией, а не шаблоном.

40 (изменено: serzh82saratov, 2012-08-16 02:52:48)

Re: AHK: Поиск и замена нескольких строк

Спасибо большое, комментарии действительно очень познавательные. Это "процедурное программирование" какая то ещё более сложная штука.
Скопировал как есть, ругается

---------------------------
=Test.ahk
---------------------------
Error:  Call to nonexistent function.

Specifically: GetSection(keyboard, Section, Content)

	Line#
	013: Path = D:\keyboard.xml
	014: FileRead,keyboard,%Path%
	016: keyboard = <keymap>
  <global>
    <keyboard>
    <q mod="ctrl,shift">Window(1)</q>
    <r mod="ctrl,shift">Window(2)</r>
    <a mod="ctrl,shift,alt">Window(3)</a>
    <a mod="alt">Window(4)</a>
    <a mod="shift">Window(5)</a>
    <a mod="ctrl">Window(6)</a>
    <a mod="shift,alt">Window(7)</a>
    <a mod="ctrl,shift">Window(8)</a>
  </global>
  <Home>
    <keyboard>
    <q mod="ctrl,shift">Window(12)</q>
    <r mod="ctrl,shift">Window(22)</r>
    <a mod="ctrl,shift,alt">Window(32)</a>
 
	043: MyKey := "a"
	044: Action := "такой"
	045: Section := "global"
	046: Replace = <%MyKey% mod="%ModPref%">%Action%</%MyKey%>
--->	047: Pos := GetSection(keyboard, Section, Content)
	048: if (Pos)  
	049: {
	051: TagPos := GetTagLines(Content, MyKey, TagText)
	052: if (TagPos[1])  
	053: {
	054: MsgBox,ReplaceTagContent(keyboard, Pos+TagPos[3]-2, StrLen(TagText[3]), Action)
	055: MsgBox,DeleteTag(keyboard, Pos+TagPos[1]-2, StrLen(TagText[1]))

The program will exit.
---------------------------
ОК   
---------------------------

AutoHotkey_L v1.1.08.00 Unicode 64-bit

То что скопировал

keyboard =
(
<keymap>
  <global>
    <keyboard>
    <q mod="ctrl,shift">Window(1)</q>
    <r mod="ctrl,shift">Window(2)</r>
    <a mod="ctrl,shift,alt">Window(3)</a>
    <a mod="alt">Window(4)</a>
    <a mod="shift">Window(5)</a>
    <a mod="ctrl">Window(6)</a>
    <a mod="shift,alt">Window(7)</a>
    <a mod="ctrl,shift">Window(8)</a>
  </global>
  <Home>
    <keyboard>
    <q mod="ctrl,shift">Window(12)</q>
    <r mod="ctrl,shift">Window(22)</r>
    <a mod="ctrl,shift,alt">Window(32)</a>
    <a mod="alt">Window(42)</a>
    <a mod="shift">Window(52)</a>
    <a mod="ctrl">Window(62)</a>
    <a mod="shift,alt">Window(72)</a>
    <a mod="ctrl,shift">Window(82)</a>
    </keyboard>
  </Home>
)
MyKey := "a"
Action := "такой"
Section := "global"
Replace = <%MyKey% mod="%ModPref%">%Action%</%MyKey%>
Pos := GetSection(keyboard, Section, Content) ; ищем секцию
if(Pos)
{
   ;TagPos := GetTagLines(Content, MyKey, TagText, "[ctrl,shif ]{10,}") ; с модификаторами ctrl+shift, не точное решение
   TagPos := GetTagLines(Content, MyKey, TagText) ; с любыми модификаторами
   if(TagPos[1]) ; если нашли
   {
      msgbox % ReplaceTagContent(keyboard, Pos+TagPos[3]-2, StrLen(TagText[3]), Action) ; замена действия
      msgbox % DeleteTag(keyboard, Pos+TagPos[1]-2, StrLen(TagText[1])) ; удаление тега
   }
   else
      MsgBox подходящих тегов нет
}
else    
   MsgBox Секция "%Section%" не найдена
ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

41

Re: AHK: Поиск и замена нескольких строк

Ругается на то, что функция GetSection не объявлена. А объявлена она в нижней части.

42

Re: AHK: Поиск и замена нескольких строк

Спасибо Вам большое за помощь. Много нового узнал. Но задача мне не по зубам. Не хватает понимания чтоб переделать под себя.
Простейшее: считываю из файла текст, объявляю переменные ищу секцию Pos := RegExMatch(Copy,"<" Section ">\s+<keyboard>.*?</" Section ">", CurSection, 1) всё работает на ура. Копирую как есть с переменными в другой скрипт под метку которую вызывает кнопка GUI, читаю из того же файла, и не находит секцию.. Проверил 100 раз, все переменные определяются, кодировку срипта менял, ни в какую не работает. Ничего не понимаю.
Подскажите ещё не по теме, а то микро темы плодить не хочется, как с ListView получить весь текст в переменную, лучше чем это ничего не придумал. Не пойму как построчно сохранять в переменную


Temp = %A_Temp%\keyboard.xml
Path = %A_ScriptDir%\keyboard.xml
FileRead, Copy, %Path%
Loop % LV_GetCount()
{
   LV_GetText(Text, A_Index)
   FileAppend, %Text% `r, *%Temp%
}
FileRead, Text, %Temp%	
FileDelete, %Temp%
MsgBox %Text%
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

43

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Подскажите ещё не по теме, а то микро темы плодить не хочется

Это неправильно.

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

44

Re: AHK: Поиск и замена нескольких строк

teadrinker пишет:
serzh82saratov пишет:

Подскажите ещё не по теме, а то микро темы плодить не хочется

Это неправильно.

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

http://forum.script-coding.com/viewtopic.php?id=7419 пост #8

ypppu пишет:

serzh82saratov, чем создавать микротемы, почитайте справку на русском языке. Последнее время возросло число вопросов, связанных с незнанием элементарных основ данного макро-языка. Как и в любой книге, следует сначала прочесть ВВЕДЕНИЕ и СОДЕРЖАНИЕ.
Подсказка: в *.chm-файлах есть поиск по нужному слову.

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

45

Re: AHK: Поиск и замена нескольких строк

Непонимание справки не отменяет необходимости выполнять правила форума.

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

46 (изменено: serzh82saratov, 2012-08-17 00:25:14)

Re: AHK: Поиск и замена нескольких строк

Оказалось RegEx не хотел заменять, и что то искать из за того что файл надо было читать так,

FileRead, Copy, *t %Path%
Loop
{
    StringReplace, Copy, Copy, %A_Tab%, %A_Space%%A_Space%%A_Space%%A_Space%, UseErrorLevel
    if ErrorLevel = 0
        break
}

и записывать FileAppend, %NewFile% `r`n, *%Path% так.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

47

Re: AHK: Поиск и замена нескольких строк

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

Loop
{
    StringReplace, MyString, MyString, `r`r, `r, UseErrorLevel
    if ErrorLevel = 0 ; Более замен не требуется.
        break
}

Переменная считана из файла, с удалением всех `n StringReplace, MyString, MyString, `n, , All, с `n почему то не находит


StartSection = #IF Config = "%ConfigSelect%"
EndSection = #IF `;Config§%ConfigSelect%
MyString := RegExReplace(MyString,"" StartSection ".*?" EndSection "", "", "", 1)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

48

Re: AHK: Поиск и замена нескольких строк

Это подойдет?

var =
(
пример 

переменной

c пустыми

строками
)

var := RegExReplace(var, "\n\n", "`n")
MsgBox % var

49 (изменено: serzh82saratov, 2012-08-24 12:56:43)

Re: AHK: Поиск и замена нескольких строк

Irbis
Не подходит, также остаются пустые строки после замены MyString := RegExReplace(MyString,"" StartSection ".*?" EndSection "", "", "", 1)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

50 (изменено: serzh82saratov, 2012-08-29 19:39:15)

Re: AHK: Поиск и замена нескольких строк

Господа подскажите как тут удалить все секции "кнопки" например
с началом  $***:: `;§Key§***§§Green§ и концом Return `;§Key§***§§Green§ из каждой  секции "конфига" вида
с началом  #IF Config = "***"  и концом  #IF ;Config§***    (где " *** " - что угодно)

Этот код удаляет правильно, только если "кнопки" находятся в верху каждого "конфига", если "кнопка" ниже то удаляет всё что выше до начала "конфига", если выбрать KeySelectR = Green , это видно. Никак не пойму в чём ошибка.

Remaper =
(
#IF Config = "XBMC"   
$#!vkD:: ;§Key§XBMC§§Red§
Send {Space} ;Нажать кнопку¶¶
MouseMove, 1919, 1079 ;Переместить мышь¶¶Action5¶¶
Return ;§Key§XBMC§§Red§
$^+Up:: ;§Key§XBMC§§Green§
Send {Space} ;Нажать кнопку¶¶Action4¶¶
Return ;§Key§XBMC§§Green§
#IF ;Config§XBMC        
#IF Config = "TMT"
$#!vkD:: ;§Key§TMT§§Red§
MouseMove 1919, 1079 ;Переместить мышь¶¶Action5¶¶
Return ;§Key§TMT§§Red§
$^+Up:: ;§Key§TMT 5§§Green§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§TMT 5§§Green§
#IF ;Config§TMT  
#IF Config = "MPC-HC"	
$#!vkD:: ;§Key§MPC-HC§§Red§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§MPC-HC§§Red§
$^+Up:: ;§Key§MPC-HC§§Green§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§MPC-HC§§Green§
#IF ;Config§MPC-HC  
#IF Config = "WINDOWS"
$#!vkD:: ;§Key§WINDOWS§§Red§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§WINDOWS§§Red§
$+Up:: ;§Key§WINDOWS§§Blue§
Return ;§Key§WINDOWS§§Blue§	
$^+Up:: ;§Key§WINDOWS§§Green§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§WINDOWS§§Green§					
#IF ;Config§WINDOWS 
#IF Config = "55555"
$#!vkD:: ;§Key§55555§§Red§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§55555§§Red§
$+Up:: ;§Key§55555§§Blue§
Return ;§Key§55555§§Blue§
$^+Up:: ;§Key§55555§§Green§
Send {Space} ;Нажать кнопку¶¶
Return ;§Key§55555§§Green§
#IF ;Config§55555
;§¶КОНЕЦ
Esc::ExitApp
)
KeySelectR = Red
Pos := 1
loop
{
Pos := RegExMatch(Remaper, "(?<=#IF Config = )(.*?)(?=#IF `;Config§)(.*?)\R", Config, Pos)
if(Pos)
{
Remaper := RegExReplace(Remaper, "\$(.*?):: `;§Key§(.*?)§§" KeySelectR "§.*?Return `;§Key§(.*?)§§" KeySelectR "§", "", "", 1, Pos)
Pos ++
}
Else
break
}
Remaper := RegExReplace(Remaper,"`r`n", "\R+", "`r`n")
Remaper := RegExReplace(Trim(Remaper,"`r`n"), "\R+", "`r`n")
MsgBox %Remaper%
Return

MPC-HC

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

51 (изменено: serzh82saratov, 2012-08-30 02:40:40)

Re: AHK: Поиск и замена нескольких строк

Remaper := RegExReplace(Remaper, "\$(.*?):: `;§Key§(.*?)§§" KeySelectR "§.*?Return `;§Key§(.*?)§§" KeySelectR "§", "", "", 1, Pos)

Какая то беда, в начале (Remaper, "\$(.*?):: , если в начале \$(.*?) заменить на точное соответствие, то всё ОК.
Какже правильно, указать любые символы с начала строки. И правильно ли записано это " §Key§(.*?)§§ ", обозначение любых символов между § .

2:39 30.08.2012
Как обычно ответ уже был [^\r\n]*::.

§Key§(.*?)§§ А с этим пока не ясно...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

52

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

§Key§(.*?)§§ А с этим пока не ясно...

Вопросительный знак отключает жадность, т.е. берётся первый подходящий под шаблон текст, а не ищется текст максимальной длины. Т.е. в строке "dog,cat,brock." шаблону "\w+?," будет соответствовать подстрока "dog,", а шаблону "\w+," подстрока "dog,cat,".

53

Re: AHK: Поиск и замена нескольких строк

Александр_ пишет:

а шаблону "\w+," подстрока "dog,cat,".

Да неужели?

RegExMatch("dog,cat,brock.", "\w+,", found)
MsgBox, % found
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

54

Re: AHK: Поиск и замена нескольких строк

teadrinker пишет:

Да неужели?

Ну да, замени запятую на что-нибудь из "\w", не содержащееся в коте и собаке...

55

Re: AHK: Поиск и замена нескольких строк

Александр_ пишет:
serzh82saratov пишет:

§Key§(.*?)§§ А с этим пока не ясно...

Вопросительный знак отключает жадность, т.е. берётся первый подходящий под шаблон текст, а не ищется текст максимальной длины. Т.е. в строке "dog,cat,brock." шаблону "\w+?," будет соответствовать подстрока "dog,", а шаблону "\w+," подстрока "dog,cat,".

Шаблон не соответствует пробелам и символам
RegExMatch("dog= ,", "\w+,", found)
MsgBox, % found

Что делать?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

56

Re: AHK: Поиск и замена нескольких строк

Господа, никак не могу понять как мне тут выделить чтото2, возвращает всё что левее первой кавычки. Помогите советом.

List = {"чтото1": "1","чтото2": "2","чтото3": "3"}
Select = 2
RegExMatch(List, "(?<="")(.*?)(?="": """ Select """)", Результат)
MsgBox %Результат%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

57

Re: AHK: Поиск и замена нескольких строк

Какже быть?!


 Reg = wwwd+www
 Search = d+
 MsgBox % Reg := RegExReplace(Reg, "" Search "", "d-")

Если в переменной содержится $+^\?* то всякие чудеса происходят, ну а если не дай бог (  такой значок, так вообще пустота на выходе.
Всё дело встряло, из за этого...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

58

Re: AHK: Поиск и замена нескольких строк

RegEx-QuickRef

59

Re: AHK: Поиск и замена нескольких строк

Сто раз перечитал. Так и немогу понять как заэкранировать, что-то в переменной, тем более что её значение не может быть известно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

60 (изменено: creature.ws, 2012-09-08 01:49:03)

Re: AHK: Поиск и замена нескольких строк

как заэкранировать, что-то в переменной

Cтроку нужно перебрать посимвольно и вставить перед каждым управляющим символом "\"

61

Re: AHK: Поиск и замена нескольких строк

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

62 (изменено: creature.ws, 2012-09-08 01:25:11)

Re: AHK: Поиск и замена нескольких строк

Не хочется — экранируйте. Четыре кавычки в 2-м параметре не нужны.

63

Re: AHK: Поиск и замена нескольких строк

Без кавычек ведь тоже самое получается.

Не хочется — экранируйте

Как экранировать, если не известно что там будет?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

64

Re: AHK: Поиск и замена нескольких строк

строку нужно перебрать посимвольно и вставить перед каждым управляющим символом "\"

65 (изменено: serzh82saratov, 2012-09-08 01:37:25)

Re: AHK: Поиск и замена нескольких строк

то есть десяток  StringReplace ?


Точнее 11 (\.*?+[{|()^$)

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

66

Re: AHK: Поиск и замена нескольких строк

Off: Не нравится мне ваш подход.

67

Re: AHK: Поиск и замена нескольких строк

Off: Не нравится мне ваш подход.

Off:
Подход обычного дилетанта, подругому пока никак. Я этим увлёкся совсем недавно, не знаю ни терминов, не даже каких-то базовых понятий, что такое переменная, узнал только на днях. Пытаюсь как могу разобратся, исключительно ради интереса. Извините если что не так.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

68 (изменено: serzh82saratov, 2012-12-07 17:00:47)

Re: AHK: Поиск и замена нескольких строк

creature.ws пишет:

как заэкранировать, что-то в переменной

Cтроку нужно перебрать посимвольно и вставить перед каждым управляющим символом "\"

Сделал функцию, может кому пригодится:

RegExSymbols(Var)
{
StringReplace, Var, Var, \, \\, All
StringReplace, Var, Var, *, \*, All
StringReplace, Var, Var, ?, \?, All
StringReplace, Var, Var, [, \[, All
StringReplace, Var, Var, |, \|, All
StringReplace, Var, Var, (, \(, All
StringReplace, Var, Var, ), \), All
StringReplace, Var, Var, ^, \^, All
StringReplace, Var, Var, $, \$, All
StringReplace, Var, Var, +, \+, All
Return Var
}

Если что-то забыл, или можно упростить код - подскажите.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

69 (изменено: serzh82saratov, 2012-12-08 00:59:21)

Re: AHK: Поиск и замена нескольких строк

Как всегда можно проще:


Var := RegExReplace(Var, "[\\.*?+[{|()^$]", "\$0")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

70 (изменено: serzh82saratov, 2012-12-08 03:27:44)

Re: AHK: Поиск и замена нескольких строк

Господа, помогите улучшить код:


String = ¶****¶****§¶****¶****§¶Result¶+\?§¶****¶****§
Var = +\?

Var := RegExReplace(Var, "[\\.*?+[{|()^$]", "\$0")
RegExMatch(String, "(?<=¶)(.*?)(?=¶" Var "§)", Res)
StringGetPos, Pos, Res, ¶, R
StringTrimLeft, Res, Res, (Pos+1)
MsgBox %Res%

Немогу понять, как найти ближайшее совпадение с помощью RegExMatch слева от "Var".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

71

Re: AHK: Поиск и замена нескольких строк

Э-э-э... Совпадение чего с чем? Если нужен набор символов между двумя "¶", тогда так:

String = ¶****¶****§¶****¶****§¶Result¶+\?§¶****¶****§
Var = +\?
MsgBox, % RegExReplace(String, ".*¶(.*)?¶\Q" . Var . "\E.*", "$1")   ; между \Q  и \E литеральный текст
creature.ws пишет:

Cтроку нужно перебрать посимвольно и вставить перед каждым управляющим символом "\"

Как видно из примера, это не обязательно.

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

72 (изменено: creature.ws, 2012-12-08 16:03:01)

Re: AHK: Поиск и замена нескольких строк

teadrinker пишет:

Как видно из примера, это не обязательно.

Я не реализацию предложил, а попробовал доступно суть донести.

73

Re: AHK: Поиск и замена нескольких строк

teadrinker
Спасибо, класс. Вариант с RegExReplace даже не рассматривал.
Скажите, а с помощью RegExMatch, это в принципе возможно?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

74 (изменено: serzh82saratov, 2012-12-08 21:07:07)

Re: AHK: Поиск и замена нескольких строк

Правильно ли я понял:

RegExReplace(String, ".*¶(.*)?¶\Q" . Var . "\E.*", "$1")

¶(.*)?¶ тут (.*) всё что угодно между ¶ , ? отключает жадность и находит ближайшее совпадение.
.*  по краям, выделяют всю строку.
$1 (1 подшаблон) заменяет всю строку на я извиняюсь (.*)?

Ещё не понял почему написано " . Var . " а не просто " Var " , нигде невстречал такой синтаксис, и есть ли между ними отличия?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

75

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

Скажите, а с помощью RegExMatch, это в принципе возможно?

String = ¶****¶****§¶****¶****§¶Result¶+\?§¶****¶****§
Var = +\?
RegExMatch(String, ".*¶(.*)?¶\Q" . Var . "\E", Found)
MsgBox, % Found1
serzh82saratov пишет:

¶(.*)?¶ тут (.*) всё что угодно между ¶ , ? отключает жадность и находит ближайшее совпадение.
.*  по краям, выделяют всю строку.
$1 (1 подшаблон) заменяет всю строку на я извиняюсь (.*)?

Да, всё верно.

serzh82saratov пишет:

Ещё не понял почему написано " . Var . " а не просто " Var " , нигде невстречал такой синтаксис, и есть ли между ними отличия?

В данном случае точка — знак конкатенации, его можно не использовать, с ним просто нагляднее.

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

76

Re: AHK: Поиск и замена нескольких строк

teadrinker

String = ¶****¶****§¶****¶****§¶Result¶+\?§¶****¶****§
Var = +\?
RegExMatch(String, ".*¶(.*)?¶\Q" . Var . "\E", Found)
MsgBox, % Found1

Спасибо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

77 (изменено: serzh82saratov, 2012-12-09 22:48:19)

Re: AHK: Поиск и замена нескольких строк

Подскажите, как тут можно получить  Result1 и Result2


String = ¶****¶****§¶Result1¶Search1§¶****¶****§¶****¶****§¶Result2¶Search2§
Var1 = Search1
Var2 = Search2
RegExMatch(String, "***", Found)
MsgBox, %Found1%`n%Found2%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

78

Re: AHK: Поиск и замена нескольких строк

String = ¶****¶****§¶Result1¶Search1§¶****¶****§¶****¶****§¶Result2¶Search2§
Var1 = Search1
Var2 = Search2
RegExMatch(String, ".*¶(.*)?¶\Q" . Var1 . "\E.*¶(.*)?¶\Q" . Var2 . "\E", Found)
MsgBox, %Found1%`n%Found2%

Если есть гарантия, что в переменных нет управляющих символов, тогда можно без "\Q" и "\E".

String = ¶****¶****§¶Result1¶Search1§¶****¶****§¶****¶****§¶Result2¶Search2§
Var1 = Search1
Var2 = Search2
RegExMatch(String, ".*¶(.*)?¶" . Var1 . ".*¶(.*)?¶" . Var2, Found)
MsgBox, %Found1%`n%Found2%
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

79

Re: AHK: Поиск и замена нескольких строк

Так почему-то не находит:

String = ¶Result2¶Search2§¶Result1¶Search1§¶****¶****§¶****¶****§¶****¶****§
Var1 = Search1
Var2 = Search2
RegExMatch(String, ".*¶(.*)?¶" . Var1 . ".*¶(.*)?¶" . Var2, Found)
MsgBox, %Found1%`n%Found2%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

80

Re: AHK: Поиск и замена нескольких строк

И не должно. Ты в строке поменял переменные местами, а в паттерне они остались на прежних местах.

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

81

Re: AHK: Поиск и замена нескольких строк

Желательно получать результат вне зависимости от раположения искомого в переменной.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

82

Re: AHK: Поиск и замена нескольких строк

Тогда только по одной переменной зараз.

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

83 (изменено: serzh82saratov, 2012-12-10 17:50:55)

Re: AHK: Поиск и замена нескольких строк

Не могу понять:

Если NeedleRegEx содержит захватывающие подшаблоны, их совпадения сохраняются в массиве, чьё базовое имя то же, что и у OutputVar. Например, если её имя Match, подстрока, найденная первым подшаблоном, сохранится в переменную Match1, вторым - в Match2 и т.д. Исключением из этого правила являются именованные подшаблоны: у них вместо порядкового номера добавляется имя. Например, подстрока, отвечающая именованному шаблону (?P<Year>\d{4}), будет сохранена в переменную MatchYear. Если какой-то конкретный подшаблон ни с чем не совпадёт (или если функция вернёт 0), соответствующая переменная будет пустой.

Внутри функции, чтобы создать массив, который будет глобальным, а не локальным, объявите базовое имя массива (например, Match) как глобальную переменную, перед тем как использовать его. Обратное верно для глобальных по умолчанию функций.

Думал что на выходе должно быть Result 1,2,3, но нет


String = ¶Result1¶Search§¶****¶****§¶Result2¶Search§¶****¶****§¶****¶****§¶Result3¶Search§
Var = Search

RegExMatch(String, ".*¶(.*)?¶" Var "§.*", Found)
MsgBox, %Found1%`n%Found2%`n%Found3%

Окончательно запутался с этими подшаблонами. Видимо что-то я отказываюсь понять.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

84

Re: AHK: Поиск и замена нескольких строк

В паттерне ".*¶(.*)?¶" Var "§.*" есть только один подшаблон — то, что находится между парой открывающей и закрывающей скобок, так что переменным Found2 и Found3 взяться неоткуда. Подшаблон может иметь лишь одно соответствие в исходной строке. Если в строке есть несколько групп символов, которые могли бы отвечать этому подшаблону, то выбирается первый слева.

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

85 (изменено: serzh82saratov, 2012-12-10 18:25:19)

Re: AHK: Поиск и замена нескольких строк

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

А почему здесь первый справа:

String = ¶Result1¶Search§¶****¶****§¶Result2¶Search§¶****¶****§¶****¶****§¶Result3¶Search§

RegExMatch(String, ".*¶(.*)?¶Search§.*", Found)
MsgBox, %Found1%

И как указывать несколько подшаблонов?

UPD
Вроде дошло:

RegExMatch(String, ".*¶(.*)?¶Search§.*" ".*¶(.*)?¶Search§.*" ".*¶(.*)?¶Search§.*", Found)
MsgBox, %Found1%`n%Found2%`n%Found3%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

86

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

А почему здесь первый справа:

Шаблон начинается с ".*", а "*" без последующего знака вопроса — это "жадный" символ, захватывает как можно больше вправо.

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

87

Re: AHK: Поиск и замена нескольких строк

Что-то невыходит:

String = ¶Result1¶Search§¶****¶****§¶Result2¶Search2§¶****¶****§¶****¶****§¶Result3¶Search§

RegExMatch(String, ".*?¶(.*?)¶Search2§", Found)
MsgBox, %Found1%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

88

Re: AHK: Поиск и замена нескольких строк

Всё правильно, шаблон начинается с ".*?¶", после звёздочки — знак вопроса, соответственно "жадность" отключена, поэтому ищет до первого "¶" слева.

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

89 (изменено: serzh82saratov, 2013-02-15 15:31:30)

Re: AHK: Поиск и замена нескольких строк

А можно ли по аналогии:


Loop, parse, clipboard, `n, `r
{
Str := A_LoopField 
if A_Index = 3
break
}
MsgBox %Str%

вернуть строку по её номеру?

MsgBox % RegExMatch (clipboard, "***", 3строка)

"одной строкой кода"

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

90 (изменено: creature.ws, 2013-02-15 16:05:48)

Re: AHK: Поиск и замена нескольких строк

C учётом, что RegExMatch возвращает номер символа с которого начинается соответствие выражению, а команда MsgBox не может быть записана в одну строку с выражением  — в одну строку не получится.

text := "
(
str1
str2
str3
str4
)"
RegExMatch(text, "`am)(?:.*\R){2}\K.+$", m)
MsgBox % m

91

Re: AHK: Поиск и замена нескольких строк

Спасибо!
С одной строкой я конечно погорячился....

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

92 (изменено: creature.ws, 2013-02-15 20:44:47)

Re: AHK: Поиск и замена нескольких строк

Нет, это я поспешил.

MsgBox,, % "" := RegExMatch("str1`nstr2`nstr3`nstr4", "`am)(?:.*\R){2}\K.+$", m),  % m

93 (изменено: serzh82saratov, 2013-02-18 23:47:12)

Re: AHK: Поиск и замена нескольких строк

Всю голову сломал, подскажите как упростить код:


Mod = Win+Alt+Shift+Ctrl+Результат
StringReplace, Pref, Mod, Win+, #
StringReplace, Pref, Pref, Ctrl+, ^
StringReplace, Pref, Pref, Alt+, !
StringReplace, Pref, Pref, Shift+, +
MsgBox  %Pref%

на каком месте будет например Win+ неизвестно.
пока вот так получилось:

Mod = Win+Alt+Shift+Ctrl+Результат
MsgBox  % RegExReplace(RegExReplace(RegExReplace(RegExReplace(Mod,"Shift\+","+"),"Alt\+","!"),"Ctrl\+","^"),"Win\+","#")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

94

Re: AHK: Поиск и замена нескольких строк

str:="Alt+Shift+Ctrl+Win+result", d:="+"
arr:={Win:"#", Alt:"!", Shift:"+", Ctrl:"^"}

StringSplit, outArr, str, % d

Loop, % outArr0-1
   StringReplace, str, str, % outArr%A_Index% d, % arr[outArr%A_Index%]

MsgBox, 262144, % A_Space, % str

95

Re: AHK: Поиск и замена нескольких строк

Вот так упростили

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

96

Re: AHK: Поиск и замена нескольких строк

Коллега Grey перемудрил слегка

Mod = Win+Alt+Shift+Ctrl+Результат
list := {Win: "#", Ctrl: "^", Alt: "!", Shift: "+"}

for k, v in list
   StringReplace, Mod, Mod, %k%+, %v%

MsgBox  %Mod%
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

97

Re: AHK: Поиск и замена нескольких строк

Слона (!), и не заметил.

98 (изменено: serzh82saratov, 2013-02-19 22:03:27)

Re: AHK: Поиск и замена нескольких строк

Как бы мне на выходе из этой строки:
Str := "1010"
попроще, без массивов и.т.п. получить:
Res := "ПервоеТретье"
или:
Str := "0101"
Res := "ВтороеЧетвёртое"

В строке могут быть только 1 и 0, если все нули то результат пустой.
------------------------------------
ничего хорошего пока непридумал:

Str := "1010"
MsgBox  % RegExReplace(RegExReplace(RegExReplace(SubStr(Str,1,1),"1","Первое")SubStr(Str,2,1),"1","Второе")
 . RegExReplace(RegExReplace(SubStr(Str,3,1),"1","Третье")SubStr(Str,4,1),"1","Четвёртое"),"0")
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

99

Re: AHK: Поиск и замена нескольких строк

serzh82saratov пишет:

...попроще, без массивов...

str:="ICQ - 00011110111000111101", pattern:="(1)", cnt:=0

While, match:=RegExMatch(str, pattern, outVar, match ? match+StrLen(outVar):1)
{
   cnt++
   While, outVar%A_Index%
      tmp:="match position: "match+(StrLen(outVar)-StrLen(outVar%A_Index%))" ("cnt ")`n"
   outList.=RTrim(tmp, "`n")"`n", tmp:=""
}

MsgBox, % 262 . (outList ? 208:160)
      , % outList ? "Result:":"Oops!"
      , % outList ? RTrim(outList, "`n"):"No matches"
      , % (outList ? 3:0) . .5

Или:

str:="ICQ - 00011110111000111101", pattern:="O)(1)"

While, RegExMatch(str, pattern, outVar , outVar.Pos(1) ? outVar.Pos(1)+outVar.Len:1)
   outList.="match position: "outVar.Pos " ("A_Index ")`n"

MsgBox, % 262 . (outList ? 208:160)
      , % outList ? "Result:":"Oops!"
      , % outList ? RTrim(outList, "`n"):"No matches"
      , % (outList ? 3:0) . .5

100 (изменено: serzh82saratov, 2013-02-20 02:41:34)

Re: AHK: Поиск и замена нескольких строк

Настолько сложно, что даже непонимаю как это использовать
Можно на примере:

Str := "0101"
****
Res := "ВтороеЧетвёртое"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui