Имя: Пароль:
1C
 
Не работает регулярное выражение.
0 Zombi
 
08.10.25
09:41
Пытаюсь сделать отбор с поиском целого слова. Средствами регулярного обмена вроде должно работать так:

Если мы ищем конкретное слово, то можно использовать метасимвол \b, обозначающий границу слова. Если поставить метасимвол с обоих концов слова, мы найдем именно это слово:

Regex: \bарка\b

Найдет: арка

Не найдет:

чарка
аркан
баварка
знахарка

У меня не срабатывает. Что не так?
1 Dzenn
 
гуру
08.10.25
08:09
Давай, я спрошу у Квена вместо тебя:
https://chat.qwen.ai/s/91494cb3-1329-40cd-b2e2-5dae1fef96fe?fev=0.0.222
2 Zombi
 
08.10.25
08:31
(1) На regex101.com попробовал /\bарка\b/u отрабатывает нормально. В 1с не получается:

        РегулярноеВыражение = "/\bарка\b/u";  
        
        Пока Выборка.Следующий() Цикл
            
            Если СтрПодобнаПоРегулярномуВыражению(Выборка.Номенклатура, РегулярноеВыражение) Тогда

Условие не отрабатывает. Выборка.Номенклатура = "Триумфальная арка была".
3 Zombi
 
08.10.25
08:34
Вот так тоже на сайте отрабатывает, в 1с нет:

РегулярноеВыражение = "/(?<![а-яА-ЯёЁ])арка(?![а-яА-ЯёЁ])/ug";  
        
        Пока Выборка.Следующий() Цикл
            
            Если СтрПодобнаПоРегулярномуВыражению(Выборка.Номенклатура, РегулярноеВыражение) Тогда
4 Волшебник
 
08.10.25
08:56
А с чего Вы взяли, что должно?
5 Zombi
 
08.10.25
09:08
(4) Ну наверное что то не так сделал. Потому и спрашиваю.
6 Волшебник
 
08.10.25
09:14
(5) Покажите документацию на регулярные выражения 1С
7 Zombi
 
08.10.25
09:20
(6) Вот СП

СтрПодобнаПоРегулярномуВыражению (StrLikeByRegularExpression)
Синтаксис:
СтрПодобнаПоРегулярномуВыражению(<Строка>, <РегулярноеВыражение>, <ИгнорироватьРегистр>, <МногострочныйПоиск>)
Параметры:
<Строка> (обязательный)
Тип: Строка.
Исходная строка.
<РегулярноеВыражение> (обязательный)
Тип: Строка.
Регулярное выражение, на соответствие которому проверяется исходная строка.
<ИгнорироватьРегистр> (необязательный)
Тип: Булево.
Истина - без учета регистра, Ложь - с учетом регистра.
Значение по умолчанию: Ложь.
<МногострочныйПоиск> (необязательный)
Тип: Булево.
Истина - выполняется многострочный поиск: символу "^" в шаблоне регулярного выражения соответствует начало каждой строки значения параметра <Строка>, символу "$" - конец каждой строки.

Ложь - символу "^" в шаблоне регулярного выражения соответствует начало значения в параметре <Строка>, символу "$" - конец текста.
Значение по умолчанию: Ложь.
Возвращаемое значение:
Тип: Булево.
Истина - строка соответствует регулярному выражению;
Ложь - в противном случае.
Описание:
Проверяет, соответствует ли передаваемая строка передаваемому шаблону исходного выражения.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Пример:
РегВыражение = "(\+)?([- ()]?\d[- _():=+]?){10,14}";
Строка = "+9(999)999 99-99";
Результат =
    СтрПодобнаПоРегулярномуВыражению(НомерТелефона, РегВыражение);
Использование в версии:
Доступен, начиная с версии 8.3.23.
Описание изменено в версии 8.3.24.
     Методическая информация
8 Волшебник
 
08.10.25
09:23
(7) и где здесь \b ?
9 Zombi
 
08.10.25
09:25
(8) <РегулярноеВыражение> (обязательный)
Тип: Строка.

Здесь
10 Волшебник
 
08.10.25
09:29
(9) там нет ничего
11 Zombi
 
08.10.25
09:31
(10) Туда шаблон передается. В нем применяется \b в том числе.
12 Zombi
 
08.10.25
09:35
\b    граница слова, например:
\bsun\b — найдет sun, но не sunny

https://www.about1c.ru/v83/language-reference/regexp
13 Волшебник
 
08.10.25
09:36
(12) это не официальная информация
14 DiMel_77
 
08.10.25
10:14
(0) Я думаю, что 1С при реализации работы с регулярными выражениями использовала "VBScript.RegExp", а там есть особенность при поиске слов - декларированная граница слова \b распространяется только на слова, написанные буквами [A-Za-z].
Т.е. если искать \bsun\b - то найдет, а вот если искать \bарка\b, то нет.
15 Zombi
 
08.10.25
10:18
(14) Тогда как с кириллицей быть?
16 DiMel_77
 
08.10.25
10:43
17 Волшебник
 
08.10.25
10:45
Qwen предлагает такие варианты:

/(?<!\w)арка(?!\w)/u


(?<![а-яА-ЯёЁ])арка(?![а-яА-ЯёЁ])
18 SilentMan
 
08.10.25
11:13
(14) 1c про свои регулярки немного по другому думает (про то, на чем они основаны), но кого это волновало :)
Ну и там еще есть параметр, который управляет поведение \b
RTFM? https://its.1c.ru/db/v83doc#bookmark:dev:TI000002650
19 Волшебник
 
08.10.25
11:17
(18) 👍 Вот это уже пруф!
20 Timon1405
 
08.10.25
11:28
(0) regex101 все работает, переключитесь в ветке FLAVOR слева на диалект .NET
СтрПодобнаПоРегулярномуВыражению возвращает совпадение или нет по шаблону ЦЕЛОЙ исходной строки
вместо него
используйте СтрНайтиПоРегулярномуВыражению
(17) мимо, в vbscript нет ретроспективных проверок
21 Zombi
 
08.10.25
11:34
(17) Не работают эти варианты. Проверил.
22 Zombi
 
08.10.25
11:37
(20) А так заработало. Спасибо.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан