Ten samouczek pokaże, jak używać Regex w VBA.
Co to jest Regex?
Regex oznacza wyrażenie regularne. Wyrażenie regularne to wzorzec złożony z sekwencji znaków, którego można użyć do znalezienia pasującego wzorca w innym ciągu. Aby użyć Regex w VBA, musisz użyć obiektu RegExp.
Wzorzec taki jak [A-C] może służyć do wyszukiwania i dopasowywania wielkich liter od A do C z sekwencji. Wzorce regex mają własną składnię i mogą być budowane przy użyciu znaku lub sekwencji znaków.
Dopasowanie znaków
Poniższa tabela przedstawia składnię, która pozwoli Ci zbudować wzorce Regex.
Składnia wzorca | Opis | Przykład | Znaleziono mecze |
---|---|---|---|
. | Dopasowuje dowolny pojedynczy znak z wyjątkiem vbNewLine | f.n | wentylator, fon, f@n, fwn |
[postacie] | Dopasowuje dowolny pojedynczy znak w nawiasach [] | [fn] | Dopasuje tylko „f” lub „n” w fan |
[^znaki] | Dopasowuje dowolny pojedynczy znak, który nie znajduje się w nawiasach [] | [^fn] | Więc pasuje do „j” w „fjn” |
[początek Koniec] | Dopasowuje dowolny znak, który jest częścią zakresu w nawiasach [] | [1-5] | Dopasuje „4” i „5” w „45” |
\w | Dopasowuje znaki alfanumeryczne i podkreślenie, ale nie spację | \w | Dopasuje „c” do „,c”. |
\W | Dopasowuje dowolne znaki niealfanumeryczne i podkreślenie | \W | Dopasuje „@” do „bb@bb” |
\s | Dopasowuje dowolny znak odstępu, taki jak spacje i tabulatory | \s | Pasowałby do „ ” w „To jest” |
\S | Dopasowuje dowolny znak inny niż biały znak | \S | Dopasuje „T” i „h” w „T h” |
\D | Dopasowuje dowolną pojedynczą cyfrę dziesiętną | \D | Dopasuje „7” w „a7h” |
\D | Dopasowuje dowolną pojedynczą cyfrę niedziesiętną | \D | Dopasuje j w „47j” |
\ | Ucieka znaki specjalne, co pozwala na ich wyszukiwanie | \. | Pasowałby do „.” w „59.pQ” |
\T | Patka | \T | Pasowałby do znaku tabulacji |
\r | Zwrot karetki | \r | Pasowałby do powrotu karetki (vbCr) |
\n | vbNowaLinia(vbTab) | \n | Pasowałby do nowej linii |
Kwantyfikatory
Możesz użyć kwantyfikatorów, aby określić, ile razy wzór ma być dopasowany do ciągu.
Kwantyfikator | Opis | Przykład | Znaleziono mecze |
---|---|---|---|
* | Dopasowuje zero lub więcej wystąpień | fn*a | fna, fa, fna, fnnna, fnfnnna |
+ | Dopasowuje jedno lub więcej wystąpień | fn+a | fna, fna, fnfna |
? | Dopasowuje zero lub jeden | fn?a | fa, fna |
{n} | Dopasowuje „n” wiele razy | d\W{4} | Pasowałby do „d…”. w „d… .&5hi” |
{n,} | Dopasowuje co najmniej „n” razy | d\W{4,} | Dopasuje „d… .&” w „d… .&5hi” |
{n,m} | Dopasowania między n i m razy | d\W{1,8} | Dopasuje „d… .&&&&” w „d… .&&&&&5hi” |
Grupowanie
Grupowanie lub przechwytywanie umożliwia wykorzystanie wzorca do przechwytywania i wyodrębniania fragmentu ciągu. Tak więc dopasowywany jest nie tylko wzorzec, ale przechwycona jest część łańcucha, która pasuje do wzorca.
Wzór | Opis | Przykład | Znalezione i przechwycone zapałki |
---|---|---|---|
(wyrażenie) | Grupuje i wychwytuje wzór w nawiasie | (\W{4}) | Pogrupuje i przechwyci „@@@@” z „1@@@@1jlmba” |
Jak korzystać z Regex w VBA?
Aby używać Regex w VBA, musisz najpierw ustawić odwołanie w edytorze VBE. W edytorze VBE przejdź do Narzędzia > Referencje > Wyrażenia regularne Microsoft VBScript.
Oto właściwości obiektu RegExp:
- Wzór - Wzór, którego zamierzasz użyć do dopasowania do ciągu.
- Ignoruj sprawę - Jeśli True, to dopasowanie ignoruje wielkość liter.
- Światowy - Jeśli True, to zostaną znalezione wszystkie dopasowania wzorca w ciągu. Jeśli False, to zostanie znaleziony tylko pierwszy odpowiednik.
- Multilinia - Jeśli True, dopasowywanie wzorców odbywa się w przerwach linii.
Oto metody obiektu RegExp:
- Test - Wyszukuje wzorzec w ciągu i zwraca True, jeśli zostanie znalezione dopasowanie.
- Zastępować - Zastępuje wystąpienia wzorca ciągiem zastępczym.
- Wykonać - Zwraca dopasowania wzorca do ciągu.
Testowanie wzorca pod kątem dopasowania ze struną
Możesz użyć metody Test, aby sprawdzić, czy wzorzec pasuje do sekwencji w ciągu wejściowym. Wynikiem jest True, jeśli zostanie znalezione dopasowanie. Poniższy kod pokaże Ci, jak przetestować wzorzec na łańcuchu:
12345678910111213 | Wzorzec testujący podrzędną regułę regularną()Dim stringOne As StringDim regexOne jako obiektUstaw regexOne = Nowe wyrażenie regularneregexOne.Pattern = "f… .a"stringOne = "000111fjo88a8"Debug.Print regexOne.Test(stringOne)Napis końcowy |
Wynik to:
Zastępowanie wzorca w ciągu
Możesz użyć metody Replace, aby zastąpić pierwsze wystąpienie pasującego wzorca w ciągu lub wszystkie wystąpienia pasującego wzorca w ciągu. Jeśli Global jest ustawiony na False, zastępowane jest tylko pierwsze wystąpienie. Poniższy kod pokaże Ci, jak zastąpić wzorzec w ciągu:
1234567891011 | Sub RegexZastępując wzorzec()Dim stringOne As StringDim regexOne jako obiektUstaw regexOne = Nowe wyrażenie regularneregexOne.Pattern = "To jest liczba"regexOne.Globalny = FałszstringOne = "To jest numer 718901"Debug.Print regexOne.Replace(stringOne, "To jest nowa liczba")Napis końcowy |
Wynik to:
Aby zastąpić tylko część liczbową ciągu użytego powyżej, użyjesz następującego kodu:
1234567891011 | Sub RegexZastępując wzorzec()Dim stringOne As StringDim regexOne jako obiektUstaw regexOne = Nowe wyrażenie regularneregexOne.Pattern = "[^\D]+"regexOne.Globalny = FałszstringOne = "To jest numer 718901"Debug.Print regexOne.Replace(stringOne, "777192")Napis końcowy |
Wynik to:
Aby zastąpić każde wystąpienie określonego wzorca w ciągu, należy ustawić wartość globalną na True. Poniższy kod pokazuje, jak zastąpić każde wystąpienie -A1289C- w ciągu:
1234567891011 | Sub RegexReplacingEveryInstanceOfApattern()Dim stringOne As StringDim regexOne jako obiektUstaw regexOne = Nowe wyrażenie regularneregexOne.Pattern = "\W\A\d+C\W"regexOne.Globalny = PrawdastringOne = "ABC-A1289C-ABC-A1289C-ABC"Debug.Print regexOne.Replace(stringOne, "IJK")Napis końcowy |
Dopasowywanie i wyświetlanie wzoru w łańcuchu
Możesz użyć metody Execute, aby dopasować jedno lub wszystkie wystąpienia wzorca w ciągu. Poniższy kod pokazuje, jak dopasować i wyświetlić wszystkie wystąpienia wzorca z ciągu:
123456789101112131415161718 | Podrzędne dopasowanie i wyświetlanie wzorca wyrażenia regularnego()Dim stringOne As StringDim regexOne jako obiektUstaw regexOne = Nowe wyrażenie regularneregexOne.Wzór = "AC"regexOne.Globalny = PrawdaregexOne.IgnoreCase = IgnoreCasestringOne = "ABC-A1289C-ADC-A1289C-AJC"Ustaw dopasowania = regexOne.Execute(stringOne)Dla każdego meczu w meczachDebug.Print Match.ValueNastępnyNapis końcowy |
Wynik to:
Powiedzmy, że chcieliśmy dopasować tylko -ADC- z powyższego ciągu. Poniższy kod pokazuje, jak dopasować i wyświetlić tylko -ADC- z ciągu:
123456789101112131415161718 | Podrzędne dopasowanie i wyświetlanie wzorca wyrażenia regularnego()Dim stringOne As StringDim regexOne jako obiektUstaw regexOne = Nowe wyrażenie regularneregexOne.Pattern = "\-\A.C\-"regexOne.Globalny = FałszregexOne.IgnoreCase = IgnoreCasestringOne = "ABC-A1289C-ADC-A1289C-AEC"Ustaw dopasowania = regexOne.Execute(stringOne)Dla każdego meczu w meczachDebug.Print Match.ValueNastępnyNapis końcowy |
Regex może zająć trochę czasu, ale jest to niezwykle potężne narzędzie do identyfikacji/manipulowania ciągami tekstu. Jest również szeroko stosowany w językach programowania.