1 (изменено: vladmany, 2018-11-11 01:26:46)

Тема: AHK: Обработка текста из буфера обмена

Доброго времени суток, форумчане. Мне нужна помощь в написании скрипта, который при нажатии допустим alt+H, жмёт ctrl+a(выделяет весь текст), обрабатывает выделенное, и вставляет обработанную версию исходного текста. Обработка должна быть примерно такая:
Скрипт обращается к специально заготовленному файлу, который содержит слова для поиска в исходном тексте, и слова для их замены. Тоесть, допустим у нас в исходном тексте где-то написано слово "distance" и нам его нужно заменить на "d". В нашем файле, в массиве будет содержатся такая надпись:
    "distance": "d"
Где слева это слово для поиска его в тексте, а после двоеточия слово для его замены.
Таких слов в том файле будет много, даже я думаю несколько массивов, только вот как это реализовать.. Буду рад вашей помощи.

2 (изменено: vladmany, 2018-11-11 10:50:42)

Re: AHK: Обработка текста из буфера обмена

Я не прошу написать мне весь скрипт, мне нужно узнать лишь структуру обращения к файлу, сравнения текста из файла, замена его на текст из этого же файла. Я просто попросил помощи, а вы меня сразу в коммерческий раздел направляете. Нe уж то здесь даже банальная помощь делается за деньги?

3

Re: AHK: Обработка текста из буфера обмена

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

4

Re: AHK: Обработка текста из буфера обмена

KusochekDobra пишет:

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

Дело в том, что я даже не знаю с чего начать, ибо только начал учить ahk. Был бы рад хотя-бы ссылкам на справки по теме. А если кто-то распишет примерный алгоритм действий, можно даже на словах, буду вдвойне благодарен.

5

Re: AHK: Обработка текста из буфера обмена

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

На мой взгляд, лучше всего при запуске скрипта считать построчно текстовый файл и на его основе создать массив (эдакий "словарь"). Когда будет готов словарь, обратиться к нему уже не составит труда.

Изучите команду Loop (чтение файла) и ассоциативный массив.

6

Re: AHK: Обработка текста из буфера обмена

https://autohotkey.com/docs/commands/RegExReplace.htm
https://autohotkey.com/docs/misc/RegEx-QuickRef.htm
https://autohotkey.com/docs/Objects.htm

list := {"была":"были","собака":"собаки"}
text := "У попа была собака."
for k,v in list
   text := RegexReplace(text, "(*UCP)\b\Q" k "\E\b", v)
msgbox % text
+ DD

7

Re: AHK: Обработка текста из буфера обмена

Кавычки нужны для замены слов, пишущихся через дефис.

8 (изменено: vladmany, 2018-11-12 12:17:16)

Re: AHK: Обработка текста из буфера обмена

Malcev, спасибо большое! Буду разбираться..

9 (изменено: vladmany, 2018-11-12 23:22:11)

Re: AHK: Обработка текста из буфера обмена

Malcev, в вашем примере более менее разобрался. Для моей задачи мне нужно брать слова для замены из файла. Занес заменяемые слова в файл, в коде прописал, чтобы скрипт читал из этого файла текст и заносил его в ту же переменную list, но проблема в том, что RegexReplace игнорирует слова из файла и не заменяет то, что должен. В чем же моя ошибка? Пытался заносить текст из файла не в переменную, а в массив, ибо это логично, но даже это не решило проблему. Может в самом RegexReplace что-то не так, ибо я сильно в его параметры не углублялся. Как всегда буду рад вашей помощи.
https://i.imgur.com/XZJ7Jcx.png

10

Re: AHK: Обработка текста из буфера обмена

vladmany пишет:

Пытался заносить текст из файла не в переменную, а в массив, ибо это логично, но даже это не решило проблему

http://forum.script-coding.com/viewtopic.php?id=12474

11

Re: AHK: Обработка текста из буфера обмена

Malcev, не особо помогло то что там пишут. Я уже знаю что мне нужен ассоциативный массив, но как его правильно написать, чтобы RegExReplace его нормально видел? Если вам не сложно, переделайте свой, вышеупомянутый пример так, чтобы инструкции по замене слов брались из файла. Так мне будет проще всего разобраться и понять как это делается.

12

Re: AHK: Обработка текста из буфера обмена

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

txt =
(
была: были
собака: собаки
)

for k,v in txt
   msgbox %k% = %v%

Читайте:
https://autohotkey.com/docs/commands/StringSplit.htm

13 (изменено: vladmany, 2018-11-13 20:22:49)

Re: AHK: Обработка текста из буфера обмена

Malcev, простите что надоедаю, просто ahk пока для меня тёмный лес, мне легче его осваивать на примерах других.  Пример той задачи, которую
мне нужно было выполнить, а именно, создание массива из файла, я искал в интернете, и долго искал. Ну чудом как-то с этим уже разобрался. Теперь последнее что я у вас попрошу, это показать мне, как можно по среди проверяемого текста указать скрипту, что на этом месте может быть либо какое-то целое число, либо ничего. Или например чтобы на этом месте было любое слово, которое находится в заранее созданном массиве. Реально это вообще реализовать без костылей?

14

Re: AHK: Обработка текста из буфера обмена

Приведите пример,  а то ничего не понятно, что вы хотите добиться.

15 (изменено: vladmany, 2018-11-13 22:28:57)

Re: AHK: Обработка текста из буфера обмена

Malcev
Есть текст:
Завтра Юле исполнится 16 лет.
Скрипт его должен заменить на:
Сегодня Юле исполнилось 16 лет.
При этом, синтаксис этой фразы такой:
%Любое слово из заранее созданного массива, в котором будут слова: Вчера, Позавчера, Завтра, Послезавтра% Юле %любое слово из: исполнится, исполнилось% %любое целое число% лет.
Если синтаксис подтвердился, то текст заменяется на:
Сегодня Юле исполнилось 16 лет.

16

Re: AHK: Обработка текста из буфера обмена

Это делается через регулярные выражения.
Чтобы вам его написать, нужно читать по ним справку с примерами (на русском тоже имеется, правда не полная).
С наскоку их понять вряд ли получится.

17

Re: AHK: Обработка текста из буфера обмена

Malcev
Я уже о них наслышан. Думал может без них как-нибудь можно реализовать данную задачу.. Всё таки без костылей походу не обойдется..

18 (изменено: DD, 2018-11-14 23:43:07)

Re: AHK: Обработка текста из буфера обмена

При заменах по списку слов из переменной "list" — как сделать, чтобы регистр из переменной "text" не изменялся?

text := "У попа былА собАка"
list =
(
была
собака
)
Loop, Parse, list, `n
{
   list := A_LoopField
   text := RegexReplace(text, "i)(*UCP)\b\Q" list "\E\b", "_" list "_")
}
msgbox % text

19 (изменено: DD, 2018-11-14 23:49:08)

Re: AHK: Обработка текста из буфера обмена

vladmany


text := "У попа была собака."
list_file = %A_ScriptDir%\list.txt
;СОДЕРЖАНИЕ ФАЙЛА:
/*
была:были
собака:собаки
*/

Loop, read, %list_file%
{
   StringSplit, list, A_LoopReadLine, :
   text := RegexReplace(text, "(*UCP)\b\Q" list1 "\E\b", list2)
}
msgbox % text

20 (изменено: DD, 2018-11-15 02:55:17)

Re: AHK: Обработка текста из буфера обмена

Вроде получилось. Но как обрабатывать случаи, когда искомое содержит единицу или латинскую «I»?

text := "У попа былА со1бАӀка"
list =
(
была
собака
)

Loop, Parse, list, `n
{
   list := A_LoopField
   RegExMatch(text, "i)(*UCP)\b\Q" list "\E\b", found)
   text := RegexReplace(text, "is)(*UCP)\b\Q" list "\E\b", "«" found "»")
}
msgbox % text

21

Re: AHK: Обработка текста из буфера обмена

Зачем тут RegexMatch?
Почитайте про обратные ссылки в регулярных выражениях.
С чего вдруг искомое должно содержать латинскую I или единицу?

22 (изменено: DD, 2018-11-15 03:49:33)

Re: AHK: Обработка текста из буфера обмена

Туговато с обратными ссылками)). Особенно на этом примере — с незнакомой конструкцией и переменными внутри. А единица и прочее среди кириллицы — это для обработки текстов национальных языков РФ, где ими фактически передают так называемую кириллическую «Палочку», которую на письме часто заменяют похожими аналогами с доступной клавиатуры: I, l, etc.

23

Re: AHK: Обработка текста из буфера обмена

Так вроде должно было работать:

text := RegexReplace(text, "i)(*UCP)\b\Q(\w+)\E\b", "«$1»")

24

Re: AHK: Обработка текста из буфера обмена

Обратная ссылка сохраняет найденное в $0. В справке об этом есть информация с примерами. По поводу единицы и i наверное придется проверять их присутствие после каждой буквы искомого слова.

+ DD

25

Re: AHK: Обработка текста из буфера обмена

Придумал брать слово из списка, замнять в нём вариации I — на конструкцию (I|Ӏ|l|1), затем передавать в таком виде в поиск через рег. выражения в основном тексте. Почему не передаётся? —

text := "У попа былА со1бАӀка"
list =
(
соӀбаӀка
)

Loop, Parse, list, `n
{
   list := A_LoopField

   list := RegexReplace(list, "i)(I|Ӏ|l|1)", "(I|Ӏ|l|1)")
   msgbox % list
   RegExMatch(text, "is)(*UCP)\b(\Q" list "\E)\b", found)
   msgbox % found

   text := RegexReplace(text, "is)(*UCP)\b\Q" list "\E\b", "«" found "»")
}
msgbox % text

26

Re: AHK: Обработка текста из буфера обмена

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

27 (изменено: DD, 2018-11-15 22:27:54)

Re: AHK: Обработка текста из буфера обмена

Вроде, пишут про связь UCP с кодировкой, но без нее тоже не работает. Как добавить в следующий код похожее эффективное выражение? Здесь берется слово из списка, в нём вариации I заменяются на конструкцию (I|Ӏ|l|1), затем это слово (со всеми вариантами I) ищется в тексте, все варианты I приводятся к одному формату, после чего старое слово заменяется в основном тексте на этот обработанный вариант слова:

text := "У попа былА со1бАӀка"
list =
(
соӀбаӀка
)

Loop, Parse, list, `n
{
   list := A_LoopField
   list := RegexReplace(list, "i)(I|Ӏ|l|1)", "(I|Ӏ|l|1)")

   RegExMatch(text, "is)" list, found)
   ;RegExMatch(text, "is)(*UCP)\b(\Q" list "\E)\b", found)

   found := RegexReplace(found, "i)(I|Ӏ|l|1)", "I")

   text := RegexReplace(text, "is)" list, "«" found "»")
   ;text := RegexReplace(text, "is)(*UCP)\b\Q" list "\E\b", "«" found "»")
}
msgbox % text

28

Re: AHK: Обработка текста из буфера обмена

DD пишет:

Вроде, пишут про связь UCP с кодировкой

(*UCP)
[v1.0.90+]: For performance, \d, \D, \s, \S, \w, \W, \b and \B recognize only ASCII characters by default, even on Unicode builds. If the pattern begins with (*UCP), Unicode properties will be used to determine which characters match. For example, \w becomes equivalent to [\p{L}\p{N}_] and \d becomes equivalent to \p{Nd}.

Что именно тут непонятно?
Помимо UCP больше ничего в шаблоне разве не используется?

29 (изменено: DD, 2018-11-16 00:05:14)

Re: AHK: Обработка текста из буфера обмена

Del.

30

Re: AHK: Обработка текста из буфера обмена

Получается, дело в \b — в том, что не определяется граница слов?

31

Re: AHK: Обработка текста из буфера обмена

Нет. Для того, чтобы \b определял границу слова у кириллицы, как раз таки и используется (*UCP).
Я ж вам привёл цитату из справки.

32

Re: AHK: Обработка текста из буфера обмена

Тогда потому, что кириллица вперемешку с цифрами и латиницей? То есть, (*UCP) и весь шаблон надо заменять на другой?

33

Re: AHK: Обработка текста из буфера обмена

Решил отказаться от регулярок, ибо они не совсем подходят для выполнения моей задачи, тем более записываются сложно. Альтернативу я нашел в следующем:
Исходный текст разбить на элементы массива, используя StringSplit, потом через if'ы проверять наличие нужного текста в нужной позиции, заменять его, и потом собрать обратно в текст. С разбиванием текста на массив я уже разобрался, только вот как собрать его обратно? Ещё меня интересует как отсортировать элементы массива в алфавитном порядке? Как я понял, функция Sort сортирует только строки, но не элементы массива.

34

Re: AHK: Обработка текста из буфера обмена

DD пишет:

Тогда потому, что кириллица вперемешку с цифрами и латиницей? То есть, (*UCP) и весь шаблон надо заменять на другой?

Вы же можете проверить это сами.
А то уже игра в угадайку пошла.

vladmany пишет:

С разбиванием текста на массив я уже разобрался, только вот как собрать его обратно? Ещё меня интересует как отсортировать элементы массива в алфавитном порядке?

array := {б:"", в:"", а:""}
For key in array
    MsgBox % result .= key

35 (изменено: DD, 2018-11-16 01:50:56)

Re: AHK: Обработка текста из буфера обмена

Проверил я это уже давно, не работает)). И из справки по UCP, так и не понял, почему так происходит, так как в шаблоне нет букв в юникоде.

36

Re: AHK: Обработка текста из буфера обмена

Как, интересно, вы проверяли...

msgbox % RegExMatch("мир", "\bмир\b")
msgbox % RegExMatch("мир", "(*UCP)\bмир\b")
msgbox % RegExMatch("world", "\bworld\b")
msgbox % RegExMatch("world", "(*UCP)\bworld\b")
DD пишет:

в шаблоне нет букв в юникоде.

А кириллица, что тогда?

37

Re: AHK: Обработка текста из буфера обмена

Malcev пишет:

Как, интересно, вы проверяли...

В 29-м посте проверял без UCP. Но если кириллица — это юникод (раньше предполагал, что раз она отображается в редакторах как простой текст, значит не юникод), тогда понятно)).

Выходит, в моем случае UCP никак не подключить? Но тогда как границу слов задействовать в этом варианте, который планируется использовать для обработки до сотни тысяч слов?

text := "былА со1бАӀка ссо1бАӀкаа"
list =
(
былА
со1баӀка
)

Loop, Parse, list, `n
{
   list := A_LoopField

   RegExMatch(text, "is)" list, found)
  ;RegExMatch(text, "is)(*UCP)\b(\Q" list "\E)\b", found)

   text := RegexReplace(text, "is)" list, "«" found "»")
  ;text := RegexReplace(text, "is)(*UCP)\b\Q" list "\E\b", "«" found "»")
}
msgbox % text

38

Re: AHK: Обработка текста из буфера обмена

DD пишет:

Выходит, в моем случае UCP никак не подключить?

Если вы вписываете (*UCP) в шаблон, то он подклюяен.
Зачем вы проверяете изначальный шаблон на своем усложненном примере?
Посмотрите какие еще используются опции в шаблоне, почитайте в справке на что они влияют и тогда возможно вы поймете причину почему в вашем примере мой шаблон не срабатывает.

39

Re: AHK: Обработка текста из буфера обмена

То есть, при правильной настройке, (*UCP) сработает на моем примере?

40

Re: AHK: Обработка текста из буфера обмена

Она и так срабатывает.

41

Re: AHK: Обработка текста из буфера обмена

В смысле — сработает на кириллице вперемешку с латиницей.

42

Re: AHK: Обработка текста из буфера обмена

Берете код из 38 сообщения, добавляете в примеру латиницу и проверяете.

43

Re: AHK: Обработка текста из буфера обмена

Ну да, не работает. Тогда тот же вопрос про похожее выражение для случаев смешанной кириллицы с латиницей, в части границы слов:

text := "былА со1бАӀка ссо1бАӀкаа"
list =
(
былА
со1баӀка
)

Loop, Parse, list, `n
{
   list := A_LoopField
   RegExMatch(text, "is)" list, found)
   text := RegexReplace(text, "is)" list, "«" found "»")
}
msgbox % text

Пробовал так, и другие похожие варианты:

text := RegexReplace(text, "is).*\b" list "\b.*", "«" found "»")

44

Re: AHK: Обработка текста из буфера обмена

Я не понимаю почему вы так упорно не хотите проверять используемые шаблоны на простых примерах.

msgbox % RegExMatch("тест ссо1бАӀкаа test", "\bссо1бАӀкаа\b")
msgbox % RegExMatch("тест ссо1бАӀкаа test", "(*UCP)\bссо1бАӀкаа\b")
+ DD

45

Re: AHK: Обработка текста из буфера обмена

Странно, ведь я убирал эти "\Q...\E", и даже читал про них)). Как всегда, спасибо за терпение и науку)).

46

Re: AHK: Обработка текста из буфера обмена

Malcev пишет:
vladmany пишет:

С разбиванием текста на массив я уже разобрался, только вот как собрать его обратно? Ещё меня интересует как отсортировать элементы массива в алфавитном порядке?

array := {б:"", в:"", а:""}
For key in array
    MsgBox % result .= key

Нет, такой способ сортировки мне не подходит. У меня есть массив:
["b","c","a"]
Его элементы нужно расставить в алфавитном порядке. То-есть чтобы массив изменился на:
["a","b","c"]

47

Re: AHK: Обработка текста из буфера обмена

Создайте список значений из массива, отсортируйте его и создайте заново из списка массив.

48 (изменено: vladmany, 2018-11-16 21:58:33)

Re: AHK: Обработка текста из буфера обмена

Malcev
Хорошо, только вот как это на практике реализовать?

49

Re: AHK: Обработка текста из буфера обмена

В справке написано как перечислить все значения, сохраняете их в переменную, которую потом сортируете.