1

Тема: AHK:Замена символов в строке

Как можно проще сделать, что бы заменялись символы которые идут по порядку и совпадают в первой String1, теми которые в String2?

Первый вариант: здесь нужно заменять символы которые совпадают по порядку

Var = aC &

String1=aBC- &
String2=123567

Результат: 1367

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

Var = Ba E

String1=a|B|c|-| |E|n
String2=1|2|3|5|6|123|7

Результат: 216123
http://alucky.globus-inter.com

2

Re: AHK:Замена символов в строке

Первый вариант слепил вот такой:

text = aC &
dest=
String1=aBC- &
String2=123567

loop,parse,text
{
  destChar:= A_LoopField
  StringGetPos,i,String1,%A_LoopField%
    ifEqual,ErrorLevel,0
        StringMid,destChar,String2,% i+1, 1
  dest:= dest destChar
}
MsgBox, Результат: %dest%
http://alucky.globus-inter.com

3 (изменено: creature.ws, 2013-05-25 18:02:47)

Re: AHK:Замена символов в строке

text := "Ba E"

string1 := "a|B|c|-| |E|n"
string2 := "1|2|3|5|6|123|7"
StringSplit string1_, string1, |
StringSplit string2_, string2, |

StringCaseSense on
loop % string1_0
    StringReplace text
        , text
        , % string1_%A_Index%
        , % string2_%A_Index%
        , All

MsgBox % text
text := "aC &"
string1 := "aBC- &"
string2 := "123567"

StringCaseSense on
loop Parse, string1
    StringReplace text
        , text
        , % A_LoopField
        , % SubStr(string2, A_Index, 1)
        , All

MsgBox % text

4 (изменено: avens, 2013-05-25 18:13:11)

Re: AHK:Замена символов в строке

Спасибо большое! Это то, что надо было!

Токо еще, что бы пробелы учитовались, если зделать например вот так:

text := "aC &"
string1 := "aBC- &"
string2 := "12 567"

Результат: "1 67"

http://alucky.globus-inter.com

5

Re: AHK:Замена символов в строке

Пробелы учитываются.
Читайте в справке о StringReplace.

6

Re: AHK:Замена символов в строке

avens
Незнаю вашей первоначальной задачи, но может проще и нагляднее пользовать массив?:


Var = Ba E
Arr :=   {"a":"1"
        , "B":"2"
        , "c":"3"
        , "-":"5"
        , " ":"6"
        , "E":"123"
        , "n":"7"}
        
MsgBox % func(Var, Arr)

Var = aC &
Arr :=   {"a":"1"
        , "B":"2"
        , "C":"3"
        , "-":"5"
        , " ":"6"
        , "&":"7"} 

MsgBox % func(Var, Arr)


func(Var, Arr)    {
    loop,parse,Var
        Res .= Arr[A_LoopField]
    return Res
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7 (изменено: creature.ws, 2013-05-25 19:26:16)

Re: AHK:Замена символов в строке

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

a := {a:123, A:234}
MsgBox % a.SetCapacity(0)

Объект a содержит одну пару ключ-значение.

8

Re: AHK:Замена символов в строке

serzh82saratov,
Незнаю вашей первоначальной задачи, но может проще и нагляднее пользовать массив?:

Чего то у меня не запускается, выдает:

Error at line 15.
Line Text: {"a"
Error: The leftmost character above is illegal in an expression.
The program will exit

creature.ws,
Пробелы учитываются.
Читайте в справке о StringReplace.

Дак не выводит пробел, вместо него цыфру 6:

text := "aC &"
string1 := "aBC- &"
string2 := "12 567"

StringCaseSense on
loop Parse, string1
    StringReplace text
        , text
        , % A_LoopField
        , % SubStr(string2, A_Index, 1)
        , All

MsgBox % text ;Результат: 1667 вместо 1 67
http://alucky.globus-inter.com

9

Re: AHK:Замена символов в строке

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

Это будет плохо
Кстати что значит

a.SetCapacity(0)

SetCapacity - не могу понять что такое.

avens пишет:

Чего то у меня не запускается, выдает:

AutoHotkey надо-бы иногда обновлять.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

10 (изменено: creature.ws, 2013-05-25 19:55:22)

Re: AHK:Замена символов в строке

Error at line 15.

Актуальная версия Autohotkey -  1.1.10.01

вместо него цыфру 6

Дык, в момент поиска пробела произведена замена "С" на пробел.
А давайте вы сформулируете какую задачу пытаетесь решить, а пользователи форума вам по возможности помогут. Код в сообщении #3 решает поставленную задачу, в сообщении #4 вы меняете условия, в приличном обществе за это канделябрами бьют

serzh82saratov, Object.SetCapacity

11 (изменено: serzh82saratov, 2013-05-25 20:19:31)

Re: AHK:Замена символов в строке

serzh82saratov, Object.SetCapacity

Спасибо, справкой и переводчиком я пользоватся научился.
Я непойму что делает сама "SetCapacity", и параметр "MaxItems:= 0" в частности.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

12 (изменено: creature.ws, 2013-05-25 20:28:48)

Re: AHK:Замена символов в строке

SetCapacity(0) пытается уменьшить количество «позиций», выделенных под ключи в объекте, до нуля. Число, возвращаемое этим методом в данном случае — действительное количество пар ключ-значение в объекте.

Вы считаете, что живой пересказ лучше холодного машинного перевода?

13

Re: AHK:Замена символов в строке

Вы считаете, что живой пересказ лучше холодного машинного перевода?

Конечно.

SetCapacity:

Регулировка мощности объекта или одного из ее полей.


MaxItems:

Максимальное количество пар ключ-значение объекта должны быть в состоянии содержать, прежде чем она должна быть автоматически расширена. Если меньше, чем текущее количество пар ключ-значение, объект сжатая для установки.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

14 (изменено: creature.ws, 2013-05-25 21:00:24)

Re: AHK:Замена символов в строке

capacity
Разве речь может идти о мощности в данном контексте? «Синонимы» в таком случае искать нужно. «Вместимость» подходит лучше всего.

15

Re: AHK:Замена символов в строке

Не надо конделябры

Я просто еще в своем скрипте думал что пробелы будут учитываться, но пришлось заменить:

destChar = %A_LoopField%
dest = %dest%%destChar%

на

destChar:= A_LoopField
dest:= dest destChar

Скачал последнюю версию, но все равно 1667, видно что то у меня, буду разбираться.

http://alucky.globus-inter.com

16 (изменено: serzh82saratov, 2013-05-25 21:17:58)

Re: AHK:Замена символов в строке

пришлось заменить

Заменить ничего неизменив?

А если так:


text := "aC &"
string1 := "aBC- &"
string2 := "12 567"

loop Parse, text 
    (p := InStr(string1, A_LoopField, 1)) ? res .= SubStr(string2, p, 1)
MsgBox  % res

но все равно 1667, видно что то у меня, буду разбираться.

Тот код так и должен работать, там должно быть "1667".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17

Re: AHK:Замена символов в строке

serzh82saratov, Заменить ничего неизменив?

Иначе переменная была пуста, без пробела. Спасибо за код

http://alucky.globus-inter.com

18

Re: AHK:Замена символов в строке

(p := InStr(string1, A_LoopField, 1)) ? res .= SubStr(string2, p, 1)

Тернарный оператор подразумевает наличие трёх логических фрагментов.
Уместно его применять если присутствует «или»

res .= (p := InStr(string1, A_LoopField, 1)) ?  SubStr(string2, p, 1) : "другая строка"

Однострочный аналог if (condition) action это (condition) and action

19

Re: AHK:Замена символов в строке

Тернарный оператор подразумевает наличие трёх логических фрагментов.

Не понимаю я вашей принципиальности по этому вопросу. В чём большой смысл замены "?" на "&&". Я и не хотел использовать тернарный оператор во избежании вызова лишней операции присваивания переменной. Пусть будет:

     (p := InStr(string1, A_LoopField, 1))  Тогда такой  res .= SubStr(string2, p, 1) 

Что это меняет?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

20

Re: AHK:Замена символов в строке

В чём большой смысл замены

Смысле не в замене ? на &&, а в правильном использовании тернарного оператора. То, что в версии 1.1 допускается конструкция (сondition)? ifBranch без : elseBranch — стандартная для Autohotkey синтаксическая поблажка.

21 (изменено: serzh82saratov, 2013-05-26 18:12:28)

Re: AHK:Замена символов в строке

допускается конструкция (сondition)? ifBranch без : elseBranch

Наверное вы имели ввиду:

(if exp) ? then exp : else exp


(if exp) ? then exp

Можно пруфлинк на рекомендуемое использование "&&" в данном случае? Я что-то в справке не найду.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

22 (изменено: creature.ws, 2013-05-26 18:23:37)

Re: AHK:Замена символов в строке

Кажется, этот диалог никогда не закончится.

Наверное вы имели ввиду:

Да какая разница.

Можно пруфлинк на рекомндуемое использование "&&"

В коде сообщения #16 вы зачем-то использовали

(p := InStr(string1, A_LoopField, 1)) ? res .= SubStr(string2, p, 1)

предполагая, что предпосылка к этому — желание сократить код, написать его в одну строку, помимо уточнения сути тернарного оператора, в сообщении #18 предложил краткий вариант записи с эквивалентной функциональностью, но не содержащий ошибок.
 
 
В справке вы можете найти статью if (expression), если слова без пруфлинка мало значат — используйте «официальную» конструкцию

if (p := InStr(string1, A_LoopField, 1))
    res .= SubStr(string2, p, 1)

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

(p := InStr(string1, A_LoopField, 1)) ? res .= SubStr(string2, p, 1)

23 (изменено: serzh82saratov, 2013-05-26 18:44:22)

Re: AHK:Замена символов в строке

предполагаю, что предпосылка к этому — желание сократить код, написать его в одну строку

Нет. Я же ответил:

Я и не хотел использовать тернарный оператор во избежании вызова лишней операции присваивания переменной.

предложил краткий вариант записи с эквивалентной функциональностью, но не содержащий ошибок.

Так и вопрос, почему это ошибка? Где упоминание про "&&"? Если использовать тернарное выражение, то в нём условие можно не заключать в скобки. Без "или", условие в скобках обязательно. И дело в том что это я выявил случайно. То есть я в справке не видел примера записи что "если" это, тогда "то" - в одно строку.
Потому не пойму где указано что правильно по другому. Но и не нашёл где пишется так, как я пишу
Или вы имеете в виду что это баг, который могут поправить, и код станет не рабочим? (вопрос риторический)

Вообщем суть я уловил. Так писать неправильно.

ТС. Поправьте код на:

loop Parse, text 
    res .= (p := InStr(string1, A_LoopField, 1)) ?  SubStr(string2, p, 1) : ""
MsgBox  % res
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

24

Re: AHK:Замена символов в строке

Я и не хотел использовать тернарный оператор

Но вы же его используете, вдобавок не указав третий операнд.

Так и вопрос, почему это ошибка?

Потому, что нет оператора ?, есть оператор ? :
В альфа версии autohotkey 2 отсутствие : уже считается ошибкой.

25

Re: AHK:Замена символов в строке

creature.ws пишет:

В альфа версии autohotkey 2 отсутствие : уже считается ошибкой.

Усё ясно. Спасибо за разъяснения.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

26

Re: AHK:Замена символов в строке

Добрый день, начинаю осваивать программмирование в AHK, по этому еще не могу разобраться в некоторый тонкостях.
Использовал этот пример как наиболее понятный для замены текста набраного в другой раскладке,


	string1 := "qwertyuiop[]asdfghjkl;'zxcvbnm,./"
	string2 := "йцукенгшщзхъфывапролджэячсмитьбю."

	If Clip1 contains q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,z,x,c,v,b,n,m
		{
		;MsgBox, The string was found.
		TrayTip, CapsLockV5, В русский, 1, 16
		loop Parse, string1
		StringReplace Clip1, Clip1, % A_LoopField, % SubStr(string2, A_Index, 1), All		
		}
	Else
		{
		;MsgBox, The string was not found.
		TrayTip, CapsLockV5, В английский, 1, 16
		loop Parse, string2
		StringReplace Clip1, Clip1, % A_LoopField, % SubStr(string1, A_Index, 1), All			
		}
Send %Clip1%

модифицировал пример под свои нужды, пока сделал автоматическое определение раскладки и перевода, в последующем думаю все таки остановлюсь на принудительном выборе.
Обнаружил у этого примера одну особенность/баг/фичу, если менять раскладку у примера с разрывом строк и переводом каретки, то вставляется 2 перевода строк и каретки.
Думал проблема в отсутствии указателя разделения строr в функции "loop Parse, string1", использовал "loop Parse, string1, `r, `n", проблема осталась. Попробовал удалить 2ные разделители принудительно "StringReplace, Clip1, Clip1, `r`n`r`n, `r`n, All", не помогло.
Как запустить дебаггер не знаю(( по этому не могу понять откуда такой эффект.

27

Re: AHK:Замена символов в строке

a154802, мне непонятен такой метод, свою проблему (превращение кириллицы в текст, который можно передать в url) я решал вот так:

translit(repstr)
{
	StringReplace, repstr, repstr, а , [[a]] , All
	StringReplace, repstr, repstr, б , [[b]] , All
	StringReplace, repstr, repstr, в , [[v]] , All
	StringReplace, repstr, repstr, г , [[g]] , All
	StringReplace, repstr, repstr, д , [[d]] , All
	StringReplace, repstr, repstr, е , [[e]] , All
	StringReplace, repstr, repstr, ё , [[yo]] , All
	StringReplace, repstr, repstr, ж , [[zh]] , All
	StringReplace, repstr, repstr, з , [[z]] , All
	StringReplace, repstr, repstr, и , [[i]] , All
	StringReplace, repstr, repstr, й , [[j]] , All
	StringReplace, repstr, repstr, к , [[k]] , All
	StringReplace, repstr, repstr, л , [[l]] , All
	StringReplace, repstr, repstr, м , [[m]] , All
	StringReplace, repstr, repstr, н , [[n]] , All
	StringReplace, repstr, repstr, о , [[o]] , All
	StringReplace, repstr, repstr, п , [[p]] , All
	StringReplace, repstr, repstr, р , [[r]] , All
	StringReplace, repstr, repstr, с , [[s]] , All
	StringReplace, repstr, repstr, т , [[t]] , All
	StringReplace, repstr, repstr, у , [[u]] , All
	StringReplace, repstr, repstr, ф , [[f]] , All
	StringReplace, repstr, repstr, х , [[x]] , All
	StringReplace, repstr, repstr, ц , [[cz]] , All
	StringReplace, repstr, repstr, ч , [[ch]] , All
	StringReplace, repstr, repstr, ш , [[sh]] , All
	StringReplace, repstr, repstr, щ , [[shh]] , All
	StringReplace, repstr, repstr, ъ , [[````]] , All
	StringReplace, repstr, repstr, ы , [[y']] , All
	StringReplace, repstr, repstr, ь , [[``]] , All
	StringReplace, repstr, repstr, э , [[e``]] , All
	StringReplace, repstr, repstr, ю , [[yu]] , All
	StringReplace, repstr, repstr, я , [[ya]] , All

	StringReplace, repstr, repstr, А , [[A]] , All
	StringReplace, repstr, repstr, Б , [[b]] , All
	StringReplace, repstr, repstr, В , [[V]] , All
	StringReplace, repstr, repstr, Г , [[G]] , All
	StringReplace, repstr, repstr, Д , [[D]] , All
	StringReplace, repstr, repstr, Е , [[E]] , All
	StringReplace, repstr, repstr, Ё , [[YO]] , All
	StringReplace, repstr, repstr, Ж , [[ZH]] , All
	StringReplace, repstr, repstr, З , [[Z]] , All
	StringReplace, repstr, repstr, И , [[i]] , All
	StringReplace, repstr, repstr, Й , [[J]] , All
	StringReplace, repstr, repstr, К , [[K]] , All
	StringReplace, repstr, repstr, Л , [[L]] , All
	StringReplace, repstr, repstr, М , [[M]] , All
	StringReplace, repstr, repstr, Н , [[N]] , All
	StringReplace, repstr, repstr, О , [[O]] , All
	StringReplace, repstr, repstr, П , [[P]] , All
	StringReplace, repstr, repstr, Р , [[R]] , All
	StringReplace, repstr, repstr, С , [[S]] , All
	StringReplace, repstr, repstr, Т , [[T]] , All
	StringReplace, repstr, repstr, У , [[u]] , All
	StringReplace, repstr, repstr, Ф , [[F]] , All
	StringReplace, repstr, repstr, Х , [[X]] , All
	StringReplace, repstr, repstr, Ц , [[CZ]] , All
	StringReplace, repstr, repstr, Ч , [[CH]] , All
	StringReplace, repstr, repstr, Ш , [[SH]] , All
	StringReplace, repstr, repstr, Щ , [[SHH]] , All
	StringReplace, repstr, repstr, Ъ , [[````]] , All
	StringReplace, repstr, repstr, Ы , [[Y']] , All
	StringReplace, repstr, repstr, Ь , [[``]] , All
	StringReplace, repstr, repstr, Э , [[E``]] , All
	StringReplace, repstr, repstr, Ю , [[YU]] , All
	StringReplace, repstr, repstr, Я , [[YA]] , All
	
	return repstr
}

Работает шикарно.

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

28

Re: AHK:Замена символов в строке

Касательно причины переносов строк — http://forum.script-coding.com/viewtopic.php?id=10138.

По поводу исправления текста, набранного в неверной раскладке, тут много сочинений и несколько тем на форуме. Как и всякий порядочный форумчанин я пользуюсь собственным велосипедом — http://forum.script-coding.com/viewtopi … 78#p113978.

a154802 пишет:

строr