Имя: Пароль:
1C
1С v8
Из строки выделить слово.
0 lirt82
 
13.02.26
10:52
Есть строка
НаименованиеОфиса = "РФ, 119334, (Москва, ул. Вавилова, дом № 5, корпус 3, помещ. 2П, этаж 3)";
по условию задачи необходимо выделить из этой строки название города. В примере это "Москва", шаблон строки строгий,
"хххххххх(<НазваниеГорода>,ххххххххххххх)" х - любой символ, включая пробел.
т.е. необходимо сформировать название города начиная от первой скобки "(" и заканчивая первой запятой после этой скобки.
Начал писать функцию, но не могу дальше продолжить:) прошу подсказать.

Функция НайтиГород(НаименованиеОфиса) Экспорт
    
    Если ПустаяСтрока(НаименованиеОфиса) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    // Обойдем все
    Для ТекСимвол = 1 По СтрДлина(НаименованиеОфиса) Цикл
        
        // Получим текущий элемент, сохранив в переменную
        ТекЭлемент = Сред(НаименованиеОфиса, ТекСимвол, 1);
        
        Если ТекЭлемент <> "(" Тогда
            Продолжить;
        Иначе
1 Kuzmich123
 
13.02.26
10:52
(0) в 8.3.23 появилось

СтрНайтиПоРегулярномуВыражению (StrFindByRegularExpression)

Возможно, это тебе поможет
2 evgen48
 
13.02.26
10:54
МассивПодстрок = СтрРазделить(НаименованиеОфиса,",", истина);
    Город = СОКРЛП(СтрЗаменить(МассивПодстрок[2],"(",""));
3 1cVandal
 
13.02.26
10:57
если шаблон строгий, то находишь скобку через
ПозицияНачала = СтрНайти(Наименованиеофиса, "(") + 1;

Это позиция с которой начинается твой город, берешь все что правее нее
СтрокаПарамПамПам = Сред(ПозицияНачала,СтрДлина(НаименованиеОфиса) -СтрДлина(ПозицияНачала ))

Далее ищешь позицию первой запятой после города через
ПозицияКонца = СтрНайти(СтрокаПарамПамПам, ",")

Ну и берешь только город
Город = Лев(СтрокаПарамПамПам, ПозицияКонца)
4 Ногаминебить
 
13.02.26
10:58
Через СтрНайти ищешь номер символа скобки, через Сред отрезаешь кусок после нее, через СтрНайти ищешь запятую, через Лев отрезаешь свой город. :)
5 ass1c
 
13.02.26
11:05
(0) Черновой алгоритм для теста, отладки и улучшения:

    Результат         = "";
    НаименованиеОфиса = "РФ, 119334, (Москва, ул. Вавилова, дом № 5, корпус 3, помещ. 2П, этаж 3)";
    
    ПозицияВхождения = СтрНайти(НаименованиеОфиса, "(");
    Если ПозицияВхождения Тогда
        
         ПозицияКонец = СтрНайти(Сред(НаименованиеОфиса, ПозицияВхождения + 1), ",");
        
         Если ПозицияКонец Тогда
            
              Результат = Сред(Сред(НаименованиеОфиса, ПозицияВхождения + 1), 1, ПозицияКонец - 1);
            
         КонецЕсли;
        
    КонецЕсли;
    
    Сообщить(Результат);
6 vbus
 
13.02.26
12:07
НаименованиеОфиса = "РФ, 119334, (Москва, ул. Вавилова, дом № 5, корпус 3, помещ. 2П, этаж 3)";   
Город = СтрНайтиПоРегулярномуВыражению(НаименованиеОфиса,"(?<=\().*?(?=,)").Значение;
7 lirt82
 
13.02.26
12:37
(6) супер лаконичный вариант, работает.
Снимаю шляпу как говориться.
8 Garykom
 
гуру
13.02.26
12:38
Задача учебная?
Если нет - только в парсер адресов загонять и получать населенный пункт с его типом

В примере это "Москва", шаблон строки строгий,
"хххххххх(<НазваниеГорода>,ххххххххххххх)" х - любой символ, включая пробел.


Получается в любых X так же может быть "шаблон города" и не один
Какой надо получить? Первый? Второй? Из Середины? Последний?
9 PR
 
13.02.26
12:51
(0) А мне нейронка выдала такую регулярку (?<=\()[^,]*(?=,)

Написала, что твой вариант с ленивым квантификатором и предпочтительнее использовать (?<=\()[^,]*(?=,), потому что:

    Чётко ограничивает набор символов (без запятых внутри результата).
    Работает быстрее за счёт отсутствия отката.
    Поведение предсказуемо и легко читается.
    Безопаснее при обработке больших или сложных строк.

Ленивый вариант .*? допустим в простых случаях, но менее оптимален и потенциально менее надёжен.
10 lirt82
 
13.02.26
13:31
(9) тоже вариант рабочий.
2 + 2 = 3.9999999999999999999999999999999...