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: Обработка текста из буфера обмена

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