Crmgo Blog

Korišćenje regularnih izraza u 1C

Korišćenje regularnih izraza u 1C

Povremeno nastaje potreba da se proveri da li odgovara određenoj šablonu, pronađe ili zameni podnizove koji odgovaraju šablonu. Za te svrhe se koriste regularni izrazi. U 1C ova tehnologija je dostupna preko COM objekta VBScript.RegExp. Ovaj objekat je ugrađen u operativni sistem Windows i...

Korišćenje regularnih izraza u 1C
Povremeno nastaje potreba da se proveri da li odgovara određeni obrazac niza znakova, pronađe ili zameni podnizove koji odgovaraju obrascu. Za ove svrhe koriste se regularni izrazi. U 1C ova tehnologija je dostupna preko COM objekta VBScript.RegExp. Ovaj objekat je ugrađen u operativni sistem Windows i spreman za korišćenje.

1. Kreiranje objekta.

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

2. Svojstva.

Svojstvo Tip podataka Opis Podrazumevana vrednost Primer
Global Logički Proveriti niz znakova do prvog poklapanja sa obrascem (Netačno) ili po celom tekstu (Tačno) Netačno

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 Logički Razlikovati (Netačno) ili ne razlikovati (Tačno) velika i mala slova Netačno

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "АБВ";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123
RegExp.IgnoreCase = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123
MultiLine Logički Višelinijski (Tačno) ili jednolinijski (Netačno) režim Netačno

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
Pattern Niz znakova Korišćeni obrazac - uzorak teksta koji se sastoji od običnih znakova i/ili posebnih metaznakova

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

3. Metode.

Metoda Opis Povratna vrednost Primer
Replace(Niz znakova, Podniz) Zamena pojavljivanja koja odgovaraju obrascu (svojstvo Pattern) u originalnom nizu znakova na navedeni podniz Izmenjen niz znakova

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв+";
ИсходнаяСтрока = "абввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
ИсходнаяСтрока = "аввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Ложь
Execute(Niz znakova) Pretraživanje pojavljivanja koja odgovaraju obrascu u originalnom nizu znakova Kolekcija pronađenih podnizova u vidu agregatnog objekta

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. Metaznakovi.

Симболи Опис Пример
\ Показује да је следећи симбол специјални симбол. Низ "\\" одговара "\", а низ "\(" одговара "(".

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] Isključujući opseg znakova. Pronalazi bilo koji znak koji nije u opsegu.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[^A-K]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
\b \B \b - Granica reči, tj. pozicija između kraja reči i razmaka. \B - NIJE granica reči.

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 - cifra. Ekvivalentno [0-9]. \D - NIJE cifra. Ekvivalentno [^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 - bilo koji znak reči, uključujući znak podvlačenja. Ekvivalentno [A-Za-z0-9_]. \W - suprotno od "\w". Ekvivalentno [^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 - razmakni znak. Ekvivalentno [\f\n\r\t\v]. \S - nerazmakni znak. Ekvivalentno [^\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 Kontrolni znak. Parametar "x" je u opsegu A-Z ili a-z. Na primer, "\cM" definiše Control-M ili znak povratka karice, "\cJ" - novi red, "\cL" - nova stranica, "\cI" - znak tabulacije, "\cK" - znak vertikalne tabulacije.

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

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

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

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ВТаб;
RegExp.Pattern = "\v";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\xn Heksadekadni ASCII kod znaka. Mora sadržati tačno dva znaka.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.Таб;
RegExp.Pattern = "\x09";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\num Referenca na prethodno fiksirane (pronađene) podnizove koji odgovaraju šablonu (SubMatches). "num" je pozitivni ceo broj, broj odgovora u kolekciji SubMatches; brojanje počinje od jedinice. Na primer, "(.)\1" definiše dva identična znaka koja slede jedan za drugim.

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 Definiše Unicode znak po njegovom heksadekadnom kodu. "n" je četvorocifreni heksadekadni kod.

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
КонецЦикла;

Napomena: tekst može biti uz pomoć AI uz ljudsku proveru. Odgovoran: Dmytro Lomaka, Kaltenkirchen.

Kategorije: 1C