Имя: Пароль:
1C
1С v8
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

ВыраженияСоСкобками = Новый Массив;

Пока Найти(")") <> 0 Цикл
  ПоложениеРазделителя = Найти(")");
  ВыраженияСоСкобками.Добавить(Лев(МояСтрока, ПоложениеРазделителя));
  МояСтрока = Сред(МояСтрока, ПоложениеРазделителя);
КонецЦикла;

Для Каждого Выражение Из ВыраженияСоСкобками Цикл
  //Здесь какая то обработка твоих выражений со скобками
КонецЦикла;

Писал прям в браузере, может и промазал где. Но мысль собственно такая.
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
ВременнаяСтрока = ТвояСтрока;

Поиск ведём во ВременнаяСтрока, а заменяем в ТвояСтрока
2 + 2 = 3.9999999999999999999999999999999...