Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Разложить строку в массив подстрок с помощью регулярных выражений в частном случае.

Разложить строку в массив подстрок с помощью регулярных выражений в частном случае.
Я
   Андроны едут
 
21.12.20 - 12:22
Собственно требуется получить из строки типа АналитикаУчетаПоПартиям текст "Аналитика учета по партиям".
То есть разделителем слов является заглавная буква.
Как это сделать регулярными выражениями?
   yzimin
 
1 - 21.12.20 - 12:44
Почитай в СП КодСимвола (CharCode)
   polosov
 
2 - 21.12.20 - 12:55
"[А-ЯЁ]{1}[а-яё]*"
IgnoreCase = Ложь;
   ДенисЧ
 
3 - 21.12.20 - 12:56
Аналитика.Наименование == "Батон "Московский";новый";

Как разбирать по буквам будешь?
   polosov
 
4 - 21.12.20 - 12:58
(3) Да ему верблюжью нотацию надо преобразовать.
   Timon1405
 
5 - 21.12.20 - 14:14
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Ложь;//Игнорировать регистр

RegExp.Global = Истина;//Поиск всех вхождений шаблона

RegExp.MultiLine = Ложь;//Многострочный режим

RegExp.Pattern = "([^^])([А-ЯЁ]+)";
Вход = "АналитикаУчетаПоПартиям";
Выход = Нрег(RegExp.Replace(Вход,"$1 $2"));
Выход = Врег(Лев(Выход,1))+Сред(Выход,2);
   TormozIT
 
6 - 21.12.20 - 14:35
(5) Такую строку "Аналитика23УчетаРФПоПартиям" неверно переварит.
   polosov
 
7 - 21.12.20 - 14:37
(6) В начальном ТЗ такого не было.
   Timon1405
 
8 - 21.12.20 - 14:49
(6) разделило-то оно аналогично платформе, как если завести реквизит в обработке и нажать таб чтобы появился синоним. но тема обыграть много заглавных подряд интересная.
   TormozIT
 
9 - 21.12.20 - 14:53
(8) Платформа красивее переваривает, чем (5)
платформа - Аналитика23 учета РФПо партиям
(5)       - Аналитика23 учета рфпо партиям
ирОбщий.ПолучитьПредставлениеИзИдентификатораЛкс(вход)  - Аналитика 23 учета РФ по партиям

Функция ПолучитьПредставлениеИзИдентификатораЛкс(ИсходнаяСтрока) Экспорт

    СтрокаВозврата = Сред(ИсходнаяСтрока, 1, 1);
    Для Сч = 2 По СтрДлина(ИсходнаяСтрока) Цикл
        ПредыдущийСимвол = Сред(ИсходнаяСтрока, Сч - 1, 1);
        ТекущийСимвол = Сред(ИсходнаяСтрока, Сч, 1);
        СледующийСимвол = Сред(ИсходнаяСтрока, Сч + 1, 1);
        ПослеследующийСимвол = Сред(ИсходнаяСтрока, Сч + 2, 1);
        Если ТекущийСимвол = "_" Тогда 
            СтрокаВозврата = СтрокаВозврата + " ";
            Продолжить;
        ИначеЕсли Истина
            И ВРЕГ(ТекущийСимвол) = ТекущийСимвол
            // В идентификаторе не должны встречаться пробелы. Поэтому было решено закомментировать следующую строку.

            //И ПредыдущийСимвол <> " "

        Тогда 
            Если Ложь
                ИЛИ ВРЕГ(ПредыдущийСимвол) <> ПредыдущийСимвол
                ИЛИ (Истина 
                    И ПредыдущийСимвол <> "_"
                    И ВРЕГ(ПредыдущийСимвол) = ПредыдущийСимвол
                    И ВРЕГ(СледующийСимвол) <> СледующийСимвол)
            Тогда 
                СтрокаВозврата = СтрокаВозврата + " ";
                Если Ложь
                    ИЛИ ВРЕГ(СледующийСимвол) <> СледующийСимвол
                    ИЛИ ВРЕГ(ПослеследующийСимвол) <> ПослеследующийСимвол
                Тогда
                    ТекущийСимвол = НРЕГ(ТекущийСимвол);
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
        СтрокаВозврата = СтрокаВозврата + ТекущийСимвол;
    КонецЦикла;
    Возврат СтрокаВозврата;

КонецФункции
   TormozIT
 
10 - 21.12.20 - 14:55
Сложные случаи по крайней мере через VBScript реализацию RegExp думаю не получится красиво переварить.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.