|
8.2 Как в раскрыть скобки в строке с помощью Функции Найти | ☑ | ||
---|---|---|---|---|
0
breezee
29.11.15
✎
15:39
|
У меня есть строка "-(+аб1+фф3...)" Как заменить символы внутри скобки? Я могу найти номер вхождения -( т.е. номер = Найти("-(",МояСтрока). Но если скобок будет несколько, т.е -(...) + -(...)? С помощью СтрНайти я бы мог вести поиск рекурсивно, но с Найти так не выйдет. Подскажите, может можно как-то это сделать?
|
|||
1
Записьдампа
29.11.15
✎
15:57
|
(0) Если можешь написать при помощи СтрНайти, то напиши МоёСтрНайти с аналогичным функционалом.
|
|||
2
Web00001
29.11.15
✎
15:57
|
Писал прям в браузере, может и промазал где. Но мысль собственно такая. |
|||
3
Записьдампа
29.11.15
✎
15:59
|
(0) И вдогонку - какая длина строки и могут ли быть вложенные скобки?
|
|||
4
Web00001
29.11.15
✎
16:00
|
(3) кхм действительно :)
|
|||
5
breezee
29.11.15
✎
16:03
|
(2) Спасибо!!! (3) Длина строки неоганиченная. Выражения со скобками навряд ли могут быть вложенными, но есть ненужные скобки, перед которыми знак не стоит(не "+" не "-")
|
|||
6
User_Agronom
29.11.15
✎
16:03
|
(0) Рекурсия наше всё!
|
|||
7
breezee
29.11.15
✎
16:22
|
Стал доделывать функцию и появилось 2 вопроса - 1 как сразу поменять "+" на "-" и "-" на "+". Если это делать в два подхода - я сначала меняю все "-" на "+", потом я хочу поменять "+" на "-", но у меня уже стоят все плюсы в получившей строке и я их все меняю на "-". Вот код того что у меня получается пока
НомераСкобок = Новый Структура("Начало,Конец"); МассивВнутриСкобья = новый Массив; Для к = 1 По СтрДлина(МояСтрока) Цикл Если Найти("-(",Сред(МояСтрока,к,2))>0 Тогда НомераСкобок.Начало = Найти("-(",Сред(МояСтрока,к,2)); //Находим начало скобок КонецЕсли; Если Найти(")",Сред(Строка,к,1))>0 Тогда НомераСкобок.Конец = Найти(")",Сред(МояСтрока,к,1)); //Находим конец скобок МассивВнутриСкобья.Добавить(НомераСкобок); КонецЕсли; КонецЦикла; Для Каждого Диапазон из МассивВнутриСкобья цикл ЧислоСимволов = Диапазон.Конец - Диапазон.Начало; МояСтрока = Сред(МояСтрока,Диапазон.Начало, ЧислоСимволов); МояСтрока = СтрЗаменить(МояСтрока,"+","-" КонецЦикла; (6) С радостью, но так можно только в СтрНайти. Как его написать(мне посоветовали тут (1) у меня понятия нет:D ) |
|||
8
breezee
29.11.15
✎
16:31
|
Второй вопрос забыл написать. Вот я получаю строку, заменяю символы, которые нужно. Так для нескольких строк - как их обратно вернуть в исходную, не разбитую строку?
|
|||
9
Web00001
29.11.15
✎
16:37
|
(7)Если ты перебираешь посимвольно зачем ты делаешь Найти? Ну и сравнивай сразу с ")".
1. Делай четыре прохода, сначала СтрЗаменить "-" на "%%+%%", затем СтрЗаменить "+" на "%%-%%", затем "%%+%%" на "+" и "%%-%%" на "-" 2. Ну сохрани ее где нить. |
|||
10
Web00001
29.11.15
✎
16:39
|
(9)Не не пойдет СтрЗаменить :)
|
|||
11
breezee
29.11.15
✎
16:48
|
(9) Чтобы знать символ с которого начались и закончились скобки. Чтобы потом получить стрку, в которой надо символы поменять.
1)Спасибо (10) Почему не подойдет? Просто буду заменять не на "%+%", а на "плюс". Идея хорошая) 2) Да мне её на место желательно вернуть с места, где я её взял. Т.е., допустим у меня есть строка с двумя скобками. первый скобки начинаются с символа 2 идут по символ 10. Вторые с 15 по 20. Я получаю строки между этих символов(2 и 10, 15 и 20). Заменяю в них знаки. Возвращаю строки обратно в исходную строку, окуда их получил. Хотя можно и не откуда их получил, но тода символы со 2 по 10 и с 15 по 20 нужно будет удалить, чтобы повторений не было |
|||
12
breezee
29.11.15
✎
17:02
|
ап
|
|||
13
DES
29.11.15
✎
18:20
|
раскладываешь строку в массив - разделитель открыв. скобка.
последнюю строку также так же разбиваешь в массив но исп. закрыв. скобку. потом попарно, как то смотришь. |
|||
14
User_Agronom
30.11.15
✎
10:19
|
(7) Вариант сыроват. Допиливай сам. Как-нибудь вставь проверку ошибок, если со скобками будет разбег.
Процедура КнопкаВыполнитьНажатие(Кнопка) Набор = "ато-(а+б+Ф1+(аб-аа-(ааб+1)*м)-ат+а)+ата"; Сообщить("Исходник: "+Набор); ВыражениеВСкобках(Набор); КонецПроцедуры Функция НайтиЗакрывающуюсяСкобку(аСтрока, аНачСимвол) КонецПодвыражения = Неопределено; Счетчик = 0; Для йй = аНачСимвол по СтрДлина(аСтрока) цикл ОчереднойСимвол = Сред(аСтрока, йй, 1); Если ОчереднойСимвол = "(" тогда Счетчик = Счетчик + 1; ИначеЕсли ОчереднойСимвол = ")" тогда Счетчик = Счетчик - 1; КонецЕсли; Если Счетчик = 0 тогда КонецПодвыражения = йй; Прервать КонецЕсли; КонецЦикла; возврат КонецПодвыражения КонецФункции Процедура ВыражениеВСкобках(аСтрока) й = 1; Выражение = ""; Пока й<СтрДлина(аСтрока) цикл Если Сред(аСтрока,й,1) = "(" тогда КонецПодвыражения = НайтиЗакрывающуюсяСкобку(аСтрока, й); СтрокаДо = Сред(аСтрока,1,й-1); СтрокаВ = Сред(аСтрока,й+1,КонецПодвыражения-й-1); СтрокаПосле = Прав(аСтрока,СтрДлина(аСтрока)-КонецПодвыражения); Сообщить("Строка до: "+СтрокаДо); Сообщить("Строка в: "+СтрокаВ); Сообщить("Строка после: "+СтрокаПосле); й = КонецПодвыражения; Сообщить("Анализ в..."); ВыражениеВСкобках(СтрокаВ); Сообщить("Анализ после..."); ВыражениеВСкобках(СтрокаПосле); Иначе Выражение = Выражение + Сред(аСтрока,й,1); й = й + 1; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
15
cw014
30.11.15
✎
10:25
|
Просто хочется узнать, а назачем это надо?
|
|||
16
cw014
30.11.15
✎
10:25
|
Интерпретатор в 1С?
|
|||
17
George Wheels
30.11.15
✎
10:31
|
ВременнаяСтрока = ТвояСтрока;
Поиск ведём во ВременнаяСтрока, а заменяем в ТвояСтрока |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |