Crmgo Блог

Використання регулярних виразів у 1С

Використання регулярних виразів у 1С

Час від часу виникає необхідність перевірити відповідність рядка певному шаблону, знайти або замінити підрядки, що відповідають шаблону. Для цих цілей використовуються регулярні вирази. У 1С ця технологія доступна через COM-об'єкт VBScript.RegExp . Даний об'єкт є вбудованим в операційну систему Windows і…

Використання регулярних виразів у 1С
Час від часу виникає необхідність перевірити відповідність рядка певному шаблону, знайти або замінити підрядки, що відповідають шаблону. Для цих цілей використовуються регулярні вирази. У 1С ця технологія доступна через COM-об'єкт VBScript.RegExp. Цей об'єкт є вбудованим в операційну систему Windows і готовий до використання.

1. Створення об'єкта.

RegExp = Новый COMОбъект("VBScript.RegExp");

2. Властивості.

Властивість Тип даних Опис Значення за замовчуванням Приклад
Global Булеве Перевіряти рядок до першої відповідності шаблону (Хибність) або по всьому тексту (Істина) Хибність

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "abc";
ИсходнаяСтрока = "abc 123 abc";
Результат = RegExp.Replace(ИсходнаяСтрока, "def"); // def 123 abc
RegExp.Global = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "def"); // def 123 def
IgnoreCase Булеве Враховувати (Хибність) або не враховувати (Істина) регістр символів Хибність

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "АБВ";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123
RegExp.IgnoreCase = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123
MultiLine Булеве Багаторядковий (Істина) або однорядковий (Хибність) режим Хибність

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
Pattern Рядок Використовуваний шаблон - зразок тексту, який складається зі звичайних символів та/або спеціальних метасимволів

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123

3. Методи.

Метод Опис Повернене значення Приклад
Replace(Рядок, Підрядок) Заміна входжень, що відповідають шаблону (властивість Pattern), у рядку-оригіналі на вказаний підрядок Змінений рядок

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123
Test(Рядок) Перевірка відповідності шаблону Булеве

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв+";
ИсходнаяСтрока = "абввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
ИсходнаяСтрока = "аввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Ложь
Execute(Рядок) Пошук відповідних шаблону входжень у рядку-оригіналі Колекція знайдених підрядків у вигляді агрегатного об'єкта

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв+";
RegExp.Global = Истина;
ИсходнаяСтрока = "абв 123 абв абвв 456";
Matches = RegExp.Execute(ИсходнаяСтрока);
Для Счетчик = 0 По Matches.Count - 1 Цикл 
    Match = Matches.Item(Счетчик);
	// Найденное значение (подстрока) + Индекс первого символа найденной подстроки в строке-оригинале + Длина найденной подстроки
	Результат = Match.Value + ", " + Match.FirstIndex + ", " + Match.Length; // абв, 0, 3
// абв, 8, 3
// абвв, 12, 4
КонецЦикла;

4. Метасимволи.

Символи Опис Приклад
\ Показує, що наступний символ є спецсимволом. Послідовність "\\" відповідає "\", а послідовність "\(" відповідає "(".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^[A-Z]:\\$";
ИсходнаяСтрока = "C:\";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
^ Визначає початок вхідного рядка. Якщо встановлено властивість Multiline, визначає також позицію відразу після "\n" (новий рядок) і "\r" (повернення каретки).

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
$ Визначає кінець вхідного рядка. Якщо встановлено властивість Multiline, визначає також позицію безпосередньо перед "\n" (новий рядок) і "\r" (повернення каретки).

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "абв$";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123 абв
// где
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123 где
// где
* Визначає жодного або кілька символів, що стоять перед ним. Еквівалентно {0,}.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "длинноше*";
ИсходнаяСтрока = "длинношеее";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
+ Визначає один або кілька символів, що стоять перед ним. Еквівалентно {1,}.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "длинноше+";
ИсходнаяСтрока = "длинношеее";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
? Визначає жодного або один символ, що стоїть перед ним. Еквівалентно {0,1}. Якщо цей метасимвол іде безпосередньо за конструкціями (*, +, ?, {n}, {n,}, {n,m}), це призводить до деякої зміни алгоритму пошуку за заданим шаблоном, що проілюстровано прикладом нижче.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111000";
RegExp.Pattern = "0+";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
RegExp.Pattern = "0+?";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 6
{n} Визначає точну кількість символів, що стоять перед ним. "n" - невід'ємне ціле число.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111001110000";
RegExp.Pattern = "0{3}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
{n,} Визначає мінімальну кількість символів, що стоять перед ним. "n" - невід'ємне ціле число. "{0,}" еквівалентно "*", а "{1,}" еквівалентно "+".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111001110000";
RegExp.Pattern = "0{3,}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
{n,m} Визначає кількість символів, що стоять перед ним (від - до). "n" і "m" - невід'ємні цілі числа, причому n <= m. "{0,1}" еквівалентно "?".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "00011101110000";
RegExp.Pattern = "0{2,3}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
. Визначає будь-який символ, крім "\n" (новий рядок). Щоб визначити будь-який символ, включаючи "\n", слід використовувати "[\s\S]".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "00" + Символы.ПС + "00";
RegExp.Pattern = ".";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 4
RegExp.Pattern = "[\s\S]";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 5
(шаблон) Фіксує підбір за шаблоном у колекції SubMatches. Щоб визначити символи "(" і ")", слід використовувати "\(" і "\)".

RegExp = Новый COMОбъект("VBScript.RegExp");
ИсходнаяСтрока = "One = 111" + Символы.ВК + "Two = 222" + Символы.ВК + "Three = 333";
// прочитаем параметр "Two"
RegExp.Pattern = "Two = (.+\r)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Match = Matches.Item(0);
Результат = Match.Value; // Two = 222
Submatches = Match.Submatches;
Для Счетчик = 0 По Submatches.Count - 1 Цикл
	Результат = Submatches.Item(Счетчик); // 222
КонецЦикла;
(?:шаблон) Корисно для комбінування частин шаблону за допомогою символу "|" ("або"). Наприклад, "госпо(?:дин|жа)" коротше, ніж "господин|госпожа". НЕ фіксує підбір у колекції SubMatches.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "господин госпожа господа";
RegExp.Pattern = "госпо(?:дин|жа)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
(?=шаблон) "Windows(?=95|98)" підбере підрядок "Windows" у рядку "Windows95", але не в рядку "WindowsNT". Подальший підбір починається негайно, а не після символів, що входять до дужок. НЕ фіксує підбір у колекції SubMatches.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "WindowsWindowsWindows";
RegExp.Pattern = "Windows(?=Win)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
Для Счетчик = 0 По Matches.Count - 1 Цикл
	Результат = Matches.Item(Счетчик).Value; // Windows
// Windows
КонецЦикла;
(?!шаблон) "Windows(?!95|98)" підбере підрядок "Windows" у рядку "WindowsNT", але не в рядку "Windows95". В решті - повністю аналогічно "(?=шаблон)".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "WindowsWindowsWindows";
RegExp.Pattern = "Windows(?!Win)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
Для Счетчик = 0 По Matches.Count - 1 Цикл
	Результат = Matches.Item(Счетчик).Value; // Windows
КонецЦикла;
x|y Умова "або". "вз|перевод" підбере "вз" і "перевод". "(вз|пере)вод" підбере "взвод" і "перевод".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "(Wi|Li)ndows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[abc] Набір символів. Знаходить будь-який із зазначених символів.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[WL]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[^abc] Виключний набір символів. Знаходить будь-який із незазначених символів.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "in[^uv]";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[a-z] Діапазон символів. Знаходить будь-який символ із діапазону.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[L-W]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[^a-z] Виключний діапазон символів. Знаходить будь-який символ, що не входить до діапазону.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[^A-K]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
\b \B \b - Межа слова, тобто позиція між кінцем слова та пробілом. \B - НЕ межа слова.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Windows Windows98";
RegExp.Pattern = "ows\b";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
RegExp.Pattern = "ows\B";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\d \D \d - цифра. Еквівалентно [0-9]. \D - НЕ цифра. Еквівалентно [^0-9].

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "WindowsNT Windows2000 Windows98";
RegExp.Pattern = "Windows\d";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
RegExp.Pattern = "Windows\D";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\w \W \w - будь-який символ слова, включно з символом підкреслення. Еквівалентно [A-Za-z0-9_]. \W - зворотне до "\w". Еквівалентно [^A-Za-z0-9_].

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows® Windows2000 Windows98";
RegExp.Pattern = "Windows\w";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
RegExp.Pattern = "Windows\W";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\s \S \s - пробільний символ. Еквівалентно [\f\n\r\t\v]. \S - непробільний символ. Еквівалентно [^\f\n\r\t\v].

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Windows Windows98";
RegExp.Pattern = "Windows\s";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
RegExp.Pattern = "Windows\S";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\cx Керуючий символ. Параметр "х" лежить у діапазоні A-Z або a-z. Наприклад, "\cM" визначає Control-M або символ повернення каретки, "\cJ" - новий рядок, "\cL" - нова сторінка, "\cI" - символ табуляції, "\cK" - символ вертикальної табуляції.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ВК + Символы.ВК;
RegExp.Pattern = "\cM";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
\f Символ нової сторінки. Еквівалент "\x0c" та "\cL".
\n Символ нового рядка. Еквівалент "\x0a" та "\cJ".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ПС;
RegExp.Pattern = "\n";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\r Символ повернення каретки. Еквівалент "\x0d" та "\cM".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ВК;
RegExp.Pattern = "\r";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\t Символ табуляції. Еквівалент "\x09" та "\cI".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.Таб;
RegExp.Pattern = "\t";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\v Символ вертикальної табуляції. Еквівалент "\x0b" та "\cK".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ВТаб;
RegExp.Pattern = "\v";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\xn Шістнадцятковий ASCII-код символу. Повинен містити рівно два символи.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.Таб;
RegExp.Pattern = "\x09";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\num Посилання на попередні зафіксовані (знайдені) підрядки-відповідності шаблону (SubMatches). "num" - додатне ціле число, номер відповідності в колекції SubMatches; відлік з одиниці. Наприклад, "(.)\1" визначає два ідентичні символи, що йдуть один за одним.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "0:0:1-2:3:3-2:2:1-4:5:5-7:7:8";
// найдём группы, в которых две последние цифры совпадают
RegExp.Pattern = "(\d)(:)(\d)(:)\3";
Matches = RegExp.Execute(ИсходнаяСтрока);
Для Счетчик = 0 По Matches.Count - 1 Цикл
    Match = Matches.Item(Счетчик);
	Результат = Match.Value; // 2:3:3
// 4:5:5
КонецЦикла;
\un Визначає Unicode-символ за його шістнадцятковим кодом. "n" - чотиризначний шістнадцятковий код.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "© Microsoft © Sun";
RegExp.Pattern = "\u00A9 Sun";
Matches = RegExp.Execute(ИсходнаяСтрока);
Для Счетчик = 0 По Matches.Count - 1 Цикл
    Match = Matches.Item(Счетчик);
	Результат = Match.Value; // © Sun
КонецЦикла;

Примітка: матеріал міг бути створений за підтримки ШІ з подальшою людською редакцією. Відповідальний за зміст: Dmytro Lomaka, Kaltenkirchen.

Рубрики: 1C