МНОГОКРАТНАЯ ЗАМЕНА ПОДСТРОКИ В СТРОКЕ
|
|
as-master | Дата: Среда, 21 Марта 2007, 20:04 | Сообщение # 1 |
Группа: Удаленные
| Имеется: строка, выдернутая из текстового файла и записанная в переменную string$. Нужно: найти в строке ВСЕ некоторые символы (например, все запятые) и заменить их на переменные a$[i]. В чём сложность: каждый найденный символ (каждую запятую) нужно заменить разными переменными, которые выдергиваются из массива случайным образом. Примерно так: i=RND(99)+1 Причём, каждая переменная a$[i] имеет свою длину символов, которая заранее неизвестна (это так, информация на всякий случай). Короче. Если тупо использовать команду StrChange и написать сценарий так: FromString$=',' i=RND(99)+1 string$=StrChange(string$,FromString$,a$[i]) то все запятые в строке заменятся одной и той же переменой a$[i], а нужно РАЗНЫМИ!!!
|
|
| |
toizy | Дата: Среда, 21 Марта 2007, 21:18 | Сообщение # 2 |
Группа: Удаленные
| Quote (as-master) | Если тупо использовать команду StrChange | Именно, что тупо. А слабо сделать так: Code | Source$='123, 456, 789' ToAdd$=' моё,' Dest$='' Quest$=',' For i=1 To Infinity p=POS(Quest$,Source$) If (p=0) Then Dest$=Dest$+Source$ Break() End str$=StrCopy(Source$,1,p) Dest$=Dest$+str$+ToAdd$ Source$= StrDel(Source$,1,p) Next i Message("","Dest$") |
|
|
| |
as-master | Дата: Четверг, 22 Марта 2007, 10:12 | Сообщение # 3 |
Группа: Удаленные
| Quote (toizy) | А слабо сделать так: | Речь шла не о том, чтобы заменить ВСЕ найденнные элементы в строке, а о том, чтобы заменить все элементы РАЗНЫМИ вставками (переменными). Задавая вопрос, я на это специально обратил внимание. А в твоем примере все найденные запятые заменяются одним и тем же словом ' моё,' взятым из переменой ToAdd$. А мне нужно, чтобы переменая выбиралась случайным образом из массива, условно называемом ToAdd$[i], и была всегда разной. И вообще, если на то пошло, функция StrChange() прекрасно заменяет именно все элементы строки, отвечающие запросу Quest$. Без всяких твоих ухищрений :)
|
|
| |
Victor | Дата: Четверг, 22 Марта 2007, 14:05 | Сообщение # 4 |
MMB Club
Группа: Проверенные
Сообщений: 15
Репутация: 1
Награды: 0
Статус: Offline
| Лови: Code | string$='I,I,I,I,I' FromString$=',' ************************** For n=1 To Infinity i=RND(99)+1 a=POS(FromString$,string$) If (a<>0) Then string$=StrSet(string$,a,a$[i]) Else Break() End Next n *************************** Message("","string$") |
|
|
| |
as-master | Дата: Четверг, 22 Марта 2007, 15:19 | Сообщение # 5 |
Группа: Удаленные
| Вот сколько делаешь в ММВ проектов, столько и возникает новых, совершенно непредвиденных проблем. Victor, вставил твой скрипт непосредственно в свой проект - выдаёт какую-то лажу. Тогда я для чистоты эксперимента вставил его в новый проект, только в начале приписал небольшой массив переменных a$[i]: a$[1]=' раз ' a$[2]=' два ' a$[3]=' три ' a$[4]=' четыре ' a$[5]=' пять ' a$[6]=' шесть ' a$[7]=' семь ' a$[8]=' восемь ' a$[9]=' девять ' a$[10]=' десять ' string$='I,I,I,I,I' FromString$=',' ************************** For n=1 To Infinity i=RND(9)+1 a=POS(FromString$,string$) If (a<>0) Then string$=StrSet(string$,a,a$[i]) Else Break() End Next n *************************** Message("","string$") Проверяю - всё работает! Что такое, мля?... Стал разбираться и нашел проблему. Она заключается в том, что мои РЕАЛЬНЫЕ (не в этом примере) переменные a$[i] ТОЖЕ содержат в себе запятые!!! И что? И эти запятые в инфинитивном цикле тоже начинают учитываться и так, слава Богу, не до бесконечности, но многократно То есть, если в приведенном выше практическом примере ты добавишь запятые ХОТЯ БЫ В ПОЛОВИНУ переменных a$[i], вот таким образом: a$[1]=' раз ' a$[2]=' два ' a$[3]=' три ' a$[4]=' четыре ' a$[5]=' пять ' a$[6]=', шесть ' a$[7]=', семь ' a$[8]=', восемь ' a$[9]=', девять ' a$[10]=', десять ' string$='I,I,I,I,I' FromString$=',' ************************** For n=1 To Infinity i=RND(9)+1 a=POS(FromString$,string$) If (a<>0) Then string$=StrSet(string$,a,a$[i]) Else Break() End Next n *************************** Message("","string$") то проблему ты сразу увидишь. Попробуй. Ну, а если запятые добавить ВО ВСЕ переменные a$[i], то программа просто зависнет, потому-что скрипт никогда не закончится. Ну что? Вновь появившаяся проблема ясна? Тогда продолжаем разговор :)
|
|
| |
Victor | Дата: Четверг, 22 Марта 2007, 17:37 | Сообщение # 6 |
MMB Club
Группа: Проверенные
Сообщений: 15
Репутация: 1
Награды: 0
Статус: Offline
| Не знаю подойдет ли тебе такой способ, но запятые в твоих реальных переменных можно заменить какими-нибудь редкими символами, а в конце заменить символы на запятые. a$[1]=' раз ' a$[2]=' два ' a$[3]=' три ' a$[4]=' четыре ' a$[5]=' &&& пять ' a$[6]=' &&& шесть ' a$[7]=' &&& семь ' a$[8]=' &&& восемь ' a$[9]=' &&& девять ' a$[10]=' &&& десять ' string$='I,I,I,I,I' FromString$=',' ************************** For n=1 To Infinity i=RND(9)+1 a=POS(FromString$,string$) If (a<>0) Then string$=StrSet(string$,a,a$[i]) Else Break() End Next n string$=StrChange(string$,'&&&',',') *************************** Message("","string$")
|
|
| |
toizy | Дата: Четверг, 22 Марта 2007, 18:28 | Сообщение # 7 |
Группа: Удаленные
| Quote (as-master) | Она заключается в том, что мои РЕАЛЬНЫЕ (не в этом примере) переменные a$[i] ТОЖЕ содержат в себе запятые!!! | Вот как раз для этого в МОЁМ коде ты берёшь из ОДНОЙ переменной и кладёшь в ДРУГУЮ.Quote (Victor) | но запятые в твоих реальных переменных можно заменить какими-нибудь редкими символами | Вот фигнёй страдать придётся. Если честно, я думал, вы поймёте мою идею, но ошибся. Вот код, работает: Code | a$[1]=' раз запятая, ' a$[2]=' два запятых,, ' a$[3]=' дофига запятых,,,, ' a$[4]=' четыре ' a$[5]=' пять ' a$[6]=' шесть ' a$[7]=' семь ' a$[8]=' восемь ' a$[9]=' девять ' a$[10]=' десять ' ** Source$='123, 456, 789, abc, def' Dest$='' Quest$=',' For i=1 To Infinity c=RND(9)+1 p=POS(Quest$,Source$) If (p=0) Then Dest$=Dest$+Source$ Break() End str$=StrCopy(Source$,1,p) Dest$=Dest$+str$+a$[c] Source$= StrDel(Source$,1,p) Next i Message("","Dest$") |
Сообщение отредактировал toizy - Четверг, 22 Марта 2007, 19:36 |
|
| |
as-master | Дата: Пятница, 23 Марта 2007, 16:43 | Сообщение # 8 |
Группа: Удаленные
| Quote (Victor) | Не знаю подойдет ли тебе такой способ, но запятые в твоих реальных переменных можно заменить какими-нибудь редкими символами, а в конце заменить символы на запятые. | В сущности, это выход. Хоть и несколько неприятный... Quote (toizy) | Вот код, работает: | Надеюсь, что мы поняли друг друга. Но проверю только в оффлайне, напишу потом. Добавлено (23 Марта 2007, 16:43) --------------------------------------------- toizy, твой скрипт на первый взгляд работает правильно, но все-таки он иногда выдает лишние запятые. Если например задать переменные такие: a$[1]=', раз, ' a$[2]=', два, ' a$[3]=', три, ' a$[4]=', четыре, ' a$[5]=', пять, ' a$[6]=', шесть, ' a$[7]=', семь, ' a$[8]=', восемь, ' a$[9]=', девять, ' a$[10]=', десять, ' то иногда выскакивают по две рядом стоящие запятые... А ведь не должно.
|
|
| |
toizy | Дата: Пятница, 23 Марта 2007, 17:18 | Сообщение # 9 |
Группа: Удаленные
| Quote (as-master) | иногда выскакивают по две рядом стоящие запятые... А ведь не должно. | Нет, ну ты меня удивляешь, ей-Богу! Ты ж смотри, как Я пишу: Code | a$[1]=' раз запятая, ' a$[2]=' два запятых,, ' | А теперь смотри, как ТЫ пишешь: Code | a$[1]=', раз, ' a$[2]=', два, ' | Чуешь разницу? Ты либо не делай так, чтобы первым символом в твоих переменных была запятая, либо поправь скрипт таким образом: a$[1]=', раз запятая, ' a$[2]=', два запятых,, ' a$[3]=', дофига запятых,,,, ' a$[4]=', четыре ,' a$[5]=', пять ,' a$[6]=', шесть ,' a$[7]=', семь ,' a$[8]=', восемь ,' a$[9]=', девять ,' a$[10]=', десять ,' ** Source$='123, 456, 789, abc, def' Dest$='' Quest$=',' For i=1 To Infinity c=RND(9)+1 p=POS(Quest$,Source$) If (p=0) Then Dest$=Dest$+Source$ Break() End str$=StrCopy(Source$,1,p-1) Dest$=Dest$+str$+a$[c] Source$= StrDel(Source$,1,p) Next i Message("","Dest$")
Сообщение отредактировал toizy - Пятница, 23 Марта 2007, 17:24 |
|
| |
as-master | Дата: Пятница, 23 Марта 2007, 19:18 | Сообщение # 10 |
Группа: Удаленные
| Ну да, это я опять тормознул. Так ведь и должно получиться было. Вот только еще одна проблема: часть этих переменных запятую спереди имеет, а другая часть - нет... :-(
|
|
| |
toizy | Дата: Пятница, 23 Марта 2007, 19:31 | Сообщение # 11 |
Группа: Удаленные
| Тады снова двойное решение. Вариант I. Самый простой. Убрать во всех переменных передние запятые, оставив только задние. Блокнот им всем в руки Вариант II. Универсальный. Внутри цикла после str$=StrCopy(Source$,1,p-1) пишем Code | ver$=StrCopy(a$[i], 1, 1) If (ver$ = ',') Then a$[i] =StrDel(a$[i], 1, 1) End |
Добавлено (23 Марта 2007, 19:31) --------------------------------------------- Согласно первому варианту код получается таким: Code | a$[1]=' раз запятая, ' a$[2]=' два запятых, ' a$[3]=' дофига запятых, ' a$[4]=' четыре, ' a$[5]=' пять, ' a$[6]=' шесть, ' a$[7]=' семь, ' a$[8]=' восемь, ' a$[9]=' девять, ' a$[10]=' десять, ' ** Source$='123, 456, 789, abc, def' Dest$='' Quest$=',' For i=1 To Infinity c=RND(9)+1 p=POS(Quest$,Source$) If (p=0) Then Dest$=Dest$+Source$ Break() End str$=StrCopy(Source$,1,p) Dest$=Dest$+str$+a$[c] Source$= StrDel(Source$,1,p) Next i Message("","Dest$") |
|
|
| |
as-master | Дата: Пятница, 23 Марта 2007, 21:02 | Сообщение # 12 |
Группа: Удаленные
| Вобщем, остановился на этом варианте - без запятых в начале. Всё работает, ОК. Спасибо! Теперь задачка посложнее. Заменяем каждую нечетную запятую, а каждую ЧЁТНУЮ - игнорируем. Основа скрипта - та же. Слабо? Это, чтоб я мог сделать опции подмены - сильнее, слабее МАТериализовать текст :)
|
|
| |
toizy | Дата: Пятница, 23 Марта 2007, 21:11 | Сообщение # 13 |
Группа: Удаленные
| Code | a$[1]=' раз запятая, ' a$[2]=' два запятых, ' a$[3]=' дофига запятых, ' a$[4]=' четыре, ' a$[5]=' пять, ' a$[6]=' шесть, ' a$[7]=' семь, ' a$[8]=' восемь, ' a$[9]=' девять, ' a$[10]=' десять, ' ** Source$='123, 456, 789, abc, def' Dest$='' Quest$=',' Over=FALSE For i=1 To Infinity c=RND(9)+1 p=POS(Quest$,Source$) If (p=0) Then Dest$=Dest$+Source$ Break() End ** str$=StrCopy(Source$,1,p) Dest$=Dest$+str$ If (Over) Then Dest$= Dest$+a$[c] End Over=Over<>TRUE ** Source$= StrDel(Source$,1,p) Next i Message("","Dest$") |
Добавлено (23 Марта 2007, 21:11) --------------------------------------------- Но тогда уж не через одну, а через случайный промежуток, скажем, в пределах от 1 до 3-х запятых
|
|
| |