Crmgo Blog

Wykorzystanie wyrażeń regularnych w 1C

Wykorzystanie wyrażeń regularnych w 1C

Od czasu do czasu zachodzi potrzeba sprawdzenia, czy dany ciąg znaków odpowiada określonym wzorcom, znalezienia lub zastąpienia podciągów pasujących do wzorca. Do tych celów służą wyrażenia regularne. W systemie 1C technologia ta jest dostępna poprzez obiekt COM VBScript.RegExp. Ten obiekt jest wbudowany w system operacyjny Windows i…

Wykorzystanie wyrażeń regularnych w 1C
Czasami zachodzi potrzeba sprawdzenia, czy ciąg znaków odpowiada określonym wzorcom, znalezienia lub zastąpienia podciągów pasujących do wzorca. Do tych celów służą wyrażenia regularne. W systemie 1C technologia ta jest dostępna poprzez obiekt COM VBScript.RegExp. Obiekt ten jest wbudowany w system operacyjny Windows i gotowy do użycia.

1. Tworzenie obiektu.

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

2. Właściwości.

Właściwość Typ danych Opis Wartość domyślna Przykład
Global Boolean Sprawdzanie ciągu do pierwszego dopasowania wzorca (False) lub całego tekstu (True) False

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 Boolean Uwzględnianie (False) lub nieuwzględnianie (True) wielkości liter False

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "АБВ";
ИсходнаяСтрока = "абв 123";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123
RegExp.IgnoreCase = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123
MultiLine Boolean Tryb wielowierszowy (True) czy jednowierszowy (False) False

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
Pattern String Używany wzorzec – wzór tekstu składający się ze zwykłych znaków i/lub specjalnych metaznaków

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

3. Metody.

Metoda Opis Wartość zwracana Przykład
Replace(String, Substring) Zastępowanie wystąpień pasujących do wzorca (właściwość Pattern) w oryginalnym ciągu na podany podciąg Zmodyfikowany ciąg

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "абв+";
ИсходнаяСтрока = "абввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
ИсходнаяСтрока = "аввввггг";
Результат = RegExp.Test(ИсходнаяСтрока); // Ложь
Execute(String) Wyszukiwanie wystąpień pasujących do wzorca w oryginalnym ciągu Kolekcja znalezionych podciągów w postaci obiektu agregatowego

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

Znaki Opis Przykład
\ Wskazuje, że następny znak jest znakiem specjalnym. Sekwencja "\\" odpowiada "\", a sekwencja "\(" odpowiada "(".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "^[A-Z]:\\$";
ИсходнаяСтрока = "C:\";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
^ Określa początek wejściowego ciągu znaków. Jeśli ustawiona jest właściwość Multiline, określa również pozycję bezpośrednio po "\n" (nowa linia) i "\r" (powrót karetki).

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "^абв";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// абв
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // где 123 абв
// где
$ Określa koniec wejściowego ciągu znaków. Jeśli ustawiona jest właściwość Multiline, określa również pozycję bezpośrednio przed "\n" (nowa linia) i "\r" (powrót karetki).

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
RegExp.Pattern = "абв$";
ИсходнаяСтрока = "абв 123 абв" + Символы.ПС + "абв";
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123 абв
// где
RegExp.Multiline = Истина;
Результат = RegExp.Replace(ИсходнаяСтрока, "где"); // абв 123 где
// где
* Określa zero lub więcej wystąpień znaków poprzedzających go. Odpowiednik {0,}.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "длинноше*";
ИсходнаяСтрока = "длинношеее";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
+ Określa jedno lub więcej wystąpień znaków poprzedzających go. Odpowiednik {1,}.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Pattern = "длинноше+";
ИсходнаяСтрока = "длинношеее";
Результат = RegExp.Test(ИсходнаяСтрока); // Истина
? Określa zero lub jedno wystąpienie znaku poprzedzającego go. Odpowiednik {0,1}. Jeśli ten znak meta występuje bezpośrednio po konstrukcjach (*, +, ?, {n}, {n,}, {n,m}), powoduje to pewną zmianę algorytmu wyszukiwania według podanego wzorca, co zilustrowano w poniższym przykładzie.

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} Określa dokładną liczbę wystąpień znaków poprzedzających go. "n" to liczba całkowita nieujemna.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111001110000";
RegExp.Pattern = "0{3}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
{n,} Określa minimalną liczbę wystąpień znaków poprzedzających go. "n" to liczba całkowita nieujemna. "{0,}" jest równoważne "*", a "{1,}" jest równoważne "+".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "000111001110000";
RegExp.Pattern = "0{3,}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
{n,m} Określa liczbę wystąpień znaków poprzedzających go (od - do). "n" i "m" to liczby całkowite nieujemne, przy czym n <= m. "{0,1}" jest równoważne "?".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "00011101110000";
RegExp.Pattern = "0{2,3}";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
. Określa dowolny znak oprócz "\n" (nowa linia). Aby określić dowolny znak, w tym "\n", należy użyć "[\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
(wzorzec) Zapisuje dopasowanie do wzorca w kolekcji SubMatches. Aby określić znaki "(" i ")", należy użyć "\(" i "\)".

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
КонецЦикла;
(?:wzorzec) Przydatne do łączenia części wzorca za pomocą znaku "|" ("lub"). Na przykład "gospod(?:in|za)" jest krótsze niż "gospodin|gospoda". NIE zapisuje dopasowania w kolekcji SubMatches.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "господин госпожа господа";
RegExp.Pattern = "госпо(?:дин|жа)";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
(?=wzorzec) "Windows(?=95|98)" dopasuje podciąg "Windows" w ciągu "Windows95", ale nie w ciągu "WindowsNT". Dalsze dopasowanie rozpoczyna się natychmiast, a nie po znakach zawartych w nawiasach. NIE zapisuje dopasowania w kolekcji 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
КонецЦикла;
(?!wzorzec) "Windows(?!95|98)" dopasuje podciąg "Windows" w ciągu "WindowsNT", ale nie w ciągu "Windows95". W pozostałych aspektach jest całkowicie analogiczne do "(?=wzorzec)".

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 Warunek "lub". "wz|przel" dopasuje "wz" i "przel". "(wz|prze)l" dopasuje "wznel" i "przel".

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "(Wi|Li)ndows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[abc] Zbiór znaków. Znajduje dowolny z podanych znaków.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[WL]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[^abc] Zbiór wykluczający znaki. Znajduje dowolny znak spoza podanych.

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[L-W]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
[^a-z] Zakres znaków wykluczających. Znajduje dowolny znak, który nie należy do zakresu.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = "Windows Lindows Linux";
RegExp.Pattern = "[^A-K]indows";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 2
\b \B \b - Granica słowa, czyli pozycja między końcem słowa a spacją. \B - NIE granica słowa.

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 - cyfra. Równoważne z [0-9]. \D - NIE cyfra. Równoważne z [^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 - dowolny znak słowotwórczy, w tym znak podkreślenia. Równoważne z [A-Za-z0-9_]. \W - odwrotność "\w". Równoważne z [^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 - znak białego znaku. Równoważne z [\f\n\r\t\v]. \S - znak niebędący białym znakiem. Równoważne z [^\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 Znak sterujący. Parametr "x" znajduje się w zakresie A-Z lub a-z. Na przykład, "\cM" określa Control-M lub znak powrotu karetki, "\cJ" - nową linię, "\cL" - nową stronę, "\cI" - znak tabulacji, "\cK" - znak tabulacji pionowej.

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

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

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

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

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.ВТаб;
RegExp.Pattern = "\v";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\xn Szesnastkowy kod ASCII znaku. Musi zawierać dokładnie dwa znaki.

RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.Global = Истина;
ИсходнаяСтрока = Символы.Таб;
RegExp.Pattern = "\x09";
Matches = RegExp.Execute(ИсходнаяСтрока);
Результат = Matches.Count; // 1
\num Odwołanie do poprzednich przypisanych (znalezionych) podciągów pasujących do wzorca (SubMatches). "num" - dodatnia liczba całkowita, numer dopasowania w kolekcji SubMatches; liczenie od jedynki. Na przykład, "(.)\1" określa dwa identyczne znaki występujące po sobie.

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 Określa znak Unicode według jego szesnastkowego kodu. "n" - czterocyfrowy kod szesnastkowy.

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

Uwaga: wpis mógł powstać z pomocą AI i redakcji. Odpowiedzialny: Dmytro Lomaka, Kaltenkirchen.

Kategorie: 1C