Добрый день. Тут увидел августовский анонс, что в 8.3.23 будут регэкспы. А у меня давно висит хотелка как бы оптимизировать поиск, например, сочетания малой русской буквы и большой русской буквы. грубо говоря, примерно так: ([а-я][А-Я]). потом поставить между этими буквами пробел.

Подскажите, можно сделать не простым перебором?
---
```1c
    Функция ВставитьПробеп(Знач стр) // если встретилось сочетание малой русской и большой русской, вставить пробел
    стр=стр+" "; // добавим служебный пробел в конце
    маленькие="аеёиоуыэюябвгджзйклмнпрстфхцчшщъь";
    большие=вРег(маленькие);

    МодифицированнаяСтрока = СтрСоединить(СтрРазделить(СтрСоединить(СтрРазделить(стр,большие),"А"),маленькие),"а");

    Пока Истина Цикл
    ПозицияБукв = СтрНайти(МодифицированнаяСтрока,"аА");
    Если ПозицияБукв = 0 Тогда
    Прервать;
    КонецЕсли;
    стр = Сред(стр,1,ПозицияБукв) + " " + Сред(стр,ПозицияБукв+1);
    МодифицированнаяСтрока= Сред(МодифицированнаяСтрока,1,ПозицияБукв) + " " + Сред(МодифицированнаяСтрока,ПозицияБукв+1);

    КонецЦикла;
    Возврат стр;
    КонецФункции
```
---
Ну, можно используя СтрРазделить() и СтрСоединить() заменить сначала все большие буквы на определенный символ, например #, а все маленькие на &.
После этого в модифицированной строке достаточно в цикле искать символы &# - и добавлять пробел в нужную позицию в исходную и модифицированную строку.

```1c
    МодифицированнаяСтрока = СтрСоединить(СтрРазделить(СтрСоединить(СтрРазделить(МояСтрока,СтрокаБольшихБукв),"#"),СтрокаМаленькихБукв),"&");
```

UPD. Чтобы не было лишних срабатываний поиска, заменять все большие на "А", маленькие на "а".
---
Еще можно не перебором строки, а перебором букв.
Сделать цикл внутри цикла - в первом цикле обходить маленькие буквы, во втором большие, и внутри сделать СтрЗаменить() для сочетания букв, на сочетание букв с пробелом.
---
так задача по сути тривиальная:

```1c
    ШаблоныЗамены = Новый Соответствие;
    Паттерн = "([а-я])([А-Я])";
    RegExp = Новый COMОбъект("VBScript.RegExp");
    RegExp.MultiLine = Истина;
    RegExp.Global = Истина;
    RegExp.IgnoreCase = Ложь;
    RegExp.Pattern = Паттерн;

    Рез = RegExp.Execute(ВхСтрока);
    Для К=0 По (Рез.Count-1) Цикл
    ШаблоныЗамены.Вставить(Рез.Item(К).Value,СтрШаблон("%1 %2",Рез.Item(К).SubMatches.Item(0),Рез.Item(К).SubMatches.Item(1)));
    КонецЦикла;
    Для Каждого Шаблон Из ШаблоныЗамены Цикл
    ВхСтрока = СтрЗаменить(ВхСтрока, Шаблон.Ключ, Шаблон.Значение);
    КонецЦикла;
```

PS. некоторые буквы русского языка не входят в диапазон [а-я]. Если их тоже нужно учитывать, то добавить в паттерн
Паттерн = "([а-я,ь,ъ,ё])([А-Я,Ь,Ъ,Ё])";
---
Большая буква от маленькой отличатся 6-м битом. В школах детей вроде же не зря всеми этими нудными информатиками калечат, там об этом что-то должны были им говорить. Ну а дальше проверяйте наличие 6-го бита. Если он есть - маленькая буква, если нет - большая. Остальные биты должны быть одинаковыми.
Для людей попроще можно просто проверять следующую букву на равенство предыдущей в нижнем регистре, если предыдущая не равна следующей. Не, буквы неодинаковые. Печаль.
Если у Вас есть квантовый компьютер, то, полагаю, Вы можете попробовать использовать какой-то квантовый алгоритм, который не будет требовать проверить перебором.
---
шестой бит! точно. совсем закисли мозги!
---
Вот так мне больше понравилось. Более понятно для моего незамысловатого соображения.

```1c
    Функция ВставитьПробеп(стр) // если встретилось сочетание малой русской и большой русской, вставить пробел
    стр=стр+" "; // добавим служебный пробел в конце
    дл=СтрДлина(стр);
    рез=";
    маленькие="аеёиоуыэюябвгджзйклмнпрстфхцчшщъь";
    большие=вРег(маленькие);
    для ии=1 по дл-1 Цикл
    буква1=Сред(стр,ии,1);
    буква2=Сред(стр,ии+1,1);
    если СтрНайти(маленькие,буква1)>0 и СтрНайти(большие,буква2)>0 тогда
    рез=рез+буква1+" "+буква2;
    ии=ии+1;
    иначе
    рез=рез+буква1;
    КонецЕсли;
    КонецЦикла;
    Возврат рез;
    КонецФункции
```
---
```1c
    Функция ВставитьПробеп(Знач стр) // если встретилось сочетание малой русской и большой русской, вставить пробел
    стр=стр+" "; // добавим служебный пробел в конце
    маленькие="аеёиоуыэюябвгджзйклмнпрстфхцчшщъь";
    большие=вРег(маленькие);

    МодифицированнаяСтрока = СтрСоединить(СтрРазделить(СтрСоединить(СтрРазделить(стр,большие),"А"),маленькие),"а");

    Пока Истина Цикл
    ПозицияБукв = СтрНайти(МодифицированнаяСтрока,"аА");
    Если ПозицияБукв = 0 Тогда
    Прервать;
    КонецЕсли;
    стр = Сред(стр,1,ПозицияБукв) + " " + Сред(стр,ПозицияБукв+1);
    МодифицированнаяСтрока= Сред(МодифицированнаяСтрока,1,ПозицияБукв) + " " + Сред(МодифицированнаяСтрока,ПозицияБукв+1);

    КонецЦикла;
    Возврат стр;
    КонецФункции
```
---
СтрСоединить(СтрРазделить(СтрСоединить(СтрРазделить(стр,большие),"А"),маленькие),"а")
жутко интересно, но не понятно. Сорри, мой незамысловатый мозг сломался от такой операции. В отладчике вроде все видно и работает, но придумать такое я не смогу. вернее, теперь , наверное, смогу ;-)

Спасибо!