Crmgo Blog

Použití regulárních výrazů v 1C

Použití regulárních výrazů v 1C

Občas je třeba ověřit, zda řetězec odpovídá určitému vzoru, najít nebo nahradit podřetězce, které tomuto vzoru odpovídají. K tomu slouží regulární výrazy. V systému 1C je tato technologie dostupná prostřednictvím COM objektu VBScript.RegExp. Tento objekt je součástí operačního systému Windows a…

Použití regulárních výrazů v 1C
Příležitostně vzniká potřeba ověřit, zda řetězec odpovídá určitému vzoru, najít nebo nahradit podřetězce odpovídající vzoru. K tomu slouží regulární výrazy. V systému 1C je tato technologie dostupná prostřednictvím COM objektu VBScript.RegExp. Tento objekt je součástí operačního systému Windows a je připraven k použití.

1. Vytvoření objektu.

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

2. Vlastnosti.

Vlastnost Datový typ Popis Výchozí hodnota Příklad
Global Logická hodnota Ověřit řetězec pouze do prvního shody se vzorem (Nepravda) nebo v celém textu (Pravda) Nepravda

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 Logická hodnota Zohlednit (Nepravda) nebo nezohlednit (Pravda) velikost písmen Nepravda

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "АБВ";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123
RegExp.IgnoreCase = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123
MultiLine Logická hodnota Víceřádkový režim (Pravda) nebo jednořádkový režim (Nepravda) Nepravda

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
Pattern Řetězec Použitý vzor – ukázkový text, který se skládá z běžných znaků a/nebo speciálních metaznaků

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

3. Metody.

Metoda Popis Návratová hodnota Příklad
Replace(Řetězec, Podřetězec) Nahrazení výskytů odpovídajících vzoru (vlastnost Pattern) v původním řetězci zadaným podřetězcem Změněný řetězec

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123
Test(Řetězec) Ověření shody se vzorem Logická hodnota

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв+";
ИсходнаяСтрока = "абввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
ИсходнаяСтрока = "аввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Ложь
Execute(Řetězec) Vyhledání výskytů odpovídajících vzoru v původním řetězci Kolekce nalezených podřetězců ve formě agregovaného objektu

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

Znaky Popis Příklad
\ Ukazuje, že následující znak je speciální znak. Sekvence "\\" odpovídá "\", a sekvence "\(" odpovídá "(".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^[A-Z]:\\$";
ИсходнаяСтрока = "C:\";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
^ Určuje začátek vstupního řetězce. Pokud je nastavena vlastnost Multiline, určuje také pozici ihned po "\n" (nový řádek) a "\r" (návrat vozíku).

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
$ Určuje konec vstupního řetězce. Pokud je nastavena vlastnost Multiline, určuje také pozici přímo před "\n" (nový řádek) a "\r" (návrat vozíku).

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "абв$";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123 абв
// где
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123 где
// где
* Určuje žádný nebo více znaků, které mu předcházejí. Ekvivalentní s {0,}.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "длинноше*";
ИсходнаяСтрока = "длинношеее";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
+ Určuje jeden nebo více znaků, které mu předcházejí. Ekvivalentní s {1,}.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "длинноше+";
ИсходнаяСтрока = "длинношеее";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
? Určuje žádný nebo jeden znak, který mu předchází. Ekvivalentní s {0,1}. Pokud tento metaznak následuje přímo za konstrukcemi (*, +, ?, {n}, {n,}, {n,m}), dochází k určité změně algoritmu vyhledávání podle zadaného vzoru, což je ilustrováno příkladem níže.

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} Určuje přesný počet znaků, které mu předcházejí. "n" je nezáporné celé číslo.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111001110000";
RegExp.Pattern = "0{3}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
{n,} Určuje minimální počet znaků, které mu předcházejí. "n" je nezáporné celé číslo. "{0,}" je ekvivalentní "*", a "{1,}" je ekvivalentní "+".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111001110000";
RegExp.Pattern = "0{3,}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
{n,m} Určuje počet znaků, které mu předcházejí (od - do). "n" a "m" jsou nezáporná celá čísla, přičemž n <= m. "{0,1}" je ekvivalentní "?".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "00011101110000";
RegExp.Pattern = "0{2,3}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
. Určuje libovolný znak kromě "\n" (nový řádek). Chcete-li určit libovolný znak, včetně "\n", použijte "[\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
(vzor) Uloží shodu podle vzoru do kolekce SubMatches. Chcete-li určit znaky "(" a ")", použijte "\(" a "\)".

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
КонецЦикла;
(?:vzor) Užitečné pro kombinování částí vzoru pomocí znaku "|" ("nebo"). Například "gosp(?:din|ža)" je kratší než "gospodin|gospoža". NEukládá shodu do kolekce SubMatches.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "господин госпожа господа";
RegExp.Pattern = "госпо(?:дин|жа)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
(?=vzor) "Windows(?=95|98)" najde podřetězec "Windows" v řetězci "Windows95", ale ne v řetězci "WindowsNT". Další vyhledávání začíná okamžitě, nikoliv po znacích obsažených v závorkách. NEukládá shodu do kolekce 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
КонецЦикла;
(?!vzor) "Windows(?!95|98)" najde podřetězec "Windows" v řetězci "WindowsNT", ale ne v řetězci "Windows95". V ostatních ohledech je zcela analogické "(?=vzor)".

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 Podmínka "nebo". "vz|převod" najde "vz" a "převod". "(vz|pře)vod" najde "vzvod" a "převod".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "(Wi|Li)ndows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[abc] Sada znaků. Najde kterýkoli z uvedených znaků.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[WL]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[^abc] Vylučující sada znaků. Najde kterýkoli z neuvedených znaků.

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[L-W]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[^a-z] Exkluzivní rozsah znaků. Najde jakýkoli znak, který není v daném rozsahu.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[^A-K]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
\b \B \b - Hrana slova, tj. pozice mezi koncem slova a mezerou. \B - Není hrana slova.

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 - číslice. Ekvivalentní [0-9]. \D - není číslice. Ekvivalentní [^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 - libovolný znak slova, včetně podtržítka. Ekvivalentní [A-Za-z0-9_]. \W - opak "\w". Ekvivalentní [^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 - bílý znak. Ekvivalentní [\f\n\r\t\v]. \S - ne bílý znak. Ekvivalentní [^\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 Řídící znak. Parametr "x" je v rozsahu A-Z nebo a-z. Například "\cM" určuje Control-M nebo znak návratu vozíku, "\cJ" - nový řádek, "\cL" - nová stránka, "\cI" - znak tabulátoru, "\cK" - znak vertikálního tabulátoru.

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

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

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

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ВТаб;
RegExp.Pattern = "\v";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\xn Hexadecimální ASCII kód znaku. Musí obsahovat právě dva znaky.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.Таб;
RegExp.Pattern = "\x09";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\num Odkaz na předchozí zachycené (nalezené) podřetězce odpovídající vzoru (SubMatches). "num" je kladné celé číslo, číslo shody v kolekci SubMatches; počítáno od jedné. Například "(.)\1" určuje dva identické znaky následující za sebou.

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 Určuje Unicode znak podle jeho hexadecimálního kódu. "n" je čtyřmístný hexadecimální kód.

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

Poznámka: příspěvek mohl vzniknout s pomocí AI a lidskou redakcí. Odpovědný: Dmytro Lomaka, Kaltenkirchen.

Rubriky: 1C