Tento tutoriál předvede, jak používat Regex ve VBA.
Co je Regex?
Regex znamená regulární výraz. Regulární výraz je vzor tvořený posloupností znaků, které můžete použít k nalezení shodného vzoru v jiném řetězci. Abyste mohli ve VBA používat Regex, musíte použít objekt RegExp.
Vzorec, jako je [A-C], lze použít k vyhledání a přiřazení velkých písmen od A do C ze sekvence. Regexové vzory mají svou vlastní syntaxi a lze je vytvořit pomocí znaku nebo posloupnosti znaků.
Odpovídající postavy
Následující tabulka ukazuje syntaxi, která vám umožní vytvářet vzory Regex.
Syntaxe vzoru | Popis | Příklad | Nalezené shody |
---|---|---|---|
. | Odpovídá libovolnému jednotlivému znaku kromě vbNewLine | f.n | fanoušek, fon, f@n, fwn |
[znaky] | Odpovídá libovolnému jednotlivému znaku v závorkách [] | [fn] | Ve ventilátoru by odpovídalo pouze „f“ nebo „n“ |
[^znaky] | Odpovídá libovolnému jednotlivému znaku, který není v závorkách [] | [^fn] | Takže by odpovídalo „j“ v „fjn“ |
[začátek-konec] | Odpovídá libovolnému znaku, který je součástí rozsahu v závorkách [] | [1-5] | Odpovídá „4“ a „5“ v „45“ |
\ w | Shoduje se s alfanumerickými znaky a podtržítkem, ale ne s mezerou | \ w | Odpovídalo by „c“ v „, c.“ |
\ W | Shoduje se s jinými než alfanumerickými znaky a podtržítkem | \ W | Odpovídá „@“ v „bb@bb“ |
\ s | Odpovídá libovolnému znaku prázdného místa, jako jsou mezery a tabulátory | \ s | Odpovídá “” v „Toto je” |
\ S | Odpovídá libovolnému znaku, který není prázdný | \ S | Odpovídá „T“ a „h“ v „T h“ |
\ d | Odpovídá libovolné desítkové číslici | \ d | Odpovídá „7“ v „a7h“ |
\ D | Shoduje se s jakoukoli jedinou bez desetinnou číslicí | \ D | Odpovídá „j“ v „47j“ |
\ | Unikne speciálním znakům, které vám pak umožní je vyhledat | \. | Odpovídá „.“ v „59.pQ“ |
\ t | Tab | \ t | Odpovídalo by znaku tabulátoru |
\ r | Návrat vozíku | \ r | Odpovídalo by návratu vozíku (vbCr) |
\ n | vbNewLine (vbTab) | \ n | Odpovídal by novému řádku |
Kvantifikátory
Pomocí kvantifikátorů můžete určit, kolikrát chcete, aby se vzorek shodoval s řetězcem.
Kvantifikátor | Popis | Příklad | Nalezené shody |
---|---|---|---|
* | Odpovídá nulovému nebo více výskytům | fn*a | fna, fa, fnna, fnnna, fnfnnna |
+ | Odpovídá jednomu nebo více výskytům | fn+a | fna, fnna, fnfnna |
? | Odpovídá nule nebo jedné | fn? a | fa, fna |
{n} | Mnohokrát odpovídá „n“ | d \ W {4} | Odpovídá „d…“ v „d…. & 5hi“ |
{n,} | Odpovídá alespoň „n “krát | d \ W {4,} | Odpovídá „d…. &“ V „d…. & 5hi“ |
{n, m} | Počet shod mezi n a m | d \ W {1,8} | Odpovídá „d…. &&&&“ v „d…. &&&& 5hi“ |
Seskupení
Seskupení nebo zachycení vám umožňuje použít vzor k zachycení a extrahování části řetězce. Vzorec se tedy nejen shoduje, ale je zachycena i část řetězce, která odpovídá vzoru.
Vzor | Popis | Příklad | Nalezené a zachycené zápasy |
---|---|---|---|
(výraz) | Seskupuje a zachycuje vzor v závorkách | (\ W {4}) | Seskupí a zachytí „@@@@“ z „1 @@@@ 1jlmba“ |
Jak používat Regex ve VBA
Abyste mohli používat Regex ve VBA, musíte nejprve nastavit referenci v editoru VBE. V editoru VBE přejděte na Nástroje> Reference> Regulární výrazy Microsoft VBScript.
Toto jsou vlastnosti objektu RegExp:
- Vzor - Vzor, který použijete pro porovnání s řetězcem.
- Ignorovat případ - Pokud je to pravda, pak shoda ignoruje velká a malá písmena.
- Globální - Pokud True, pak jsou nalezeny všechny shody vzoru v řetězci. Pokud je hodnota False, je nalezena pouze první shoda.
- MultiLine - Pokud je to pravda, dochází ke shodě vzorů přes konce řádků.
Toto jsou metody objektu RegExp:
- Test - Vyhledá vzor v řetězci a vrátí shodu True, pokud je nalezena shoda.
- Nahradit - Nahradí výskyty vzoru náhradním řetězcem.
- Vykonat - Vrací shody vzoru proti řetězci.
Testování vzoru pro shodu proti řetězci
Metodu Test můžete použít ke kontrole, zda vzor odpovídá sekvenci ve vstupním řetězci. Výsledek je True, pokud je nalezena shoda. Následující kód vám ukáže, jak otestovat vzor na řetězci:
12345678910111213 | Sub RegexTestingAPattern ()Dim stringJeden jako řetězecDim regexOne jako objektNastavit regexOne = New RegExpregexOne.Pattern = "f… .a"stringOne = "000111fjo88a8"Debug.Print regexOne.Test (stringOne)End Sub |
Výsledek je:
Výměna vzoru v řetězci
Metodu Replace můžete použít k nahrazení první instance odpovídajícího vzoru v řetězci nebo všech instancí shodného vzoru v řetězci. Pokud je Global nastaveno na False, bude nahrazena pouze první instance. Následující kód vám ukáže, jak nahradit vzor v řetězci:
1234567891011 | Sub RegexReplacingAPattern ()Dim stringOne As StringDim regexOne jako objektNastavit regexOne = New RegExpregexOne.Pattern = "Toto je číslo"regexOne.Global = FalsestringOne = "Toto je číslo 718901"Debug.Print regexOne.Replace (stringOne, "To je nové číslo")End Sub |
Výsledek je:
Chcete -li nahradit pouze část čísla výše použitého řetězce, použijte následující kód:
1234567891011 | Sub RegexReplacingAPattern ()Dim stringJeden jako řetězecDim regexOne jako objektNastavit regexOne = New RegExpregexOne.Pattern = "[^\ D]+"regexOne.Global = FalsestringOne = "Toto je číslo 718901"Debug.Print regexOne.Replace (stringOne, "777192")End Sub |
Výsledek je:
Chcete -li nahradit každou instanci určitého vzoru v řetězci, nastavíte globální hodnotu na True. Následující kód ukazuje, jak nahradit každou instanci -A1289C- v řetězci:
1234567891011 | SubregexReplacingEveryInstanceOfAPattern ()Dim stringJeden jako řetězecDim regexOne jako objektNastavit regexOne = New RegExpregexOne.Pattern = "\ W \ A \ d+C \ W"regexOne.Global = TruestringOne = "ABC-A1289C-ABC-A1289C-ABC"Debug.Print regexOne.Replace (stringOne, "IJK")End Sub |
Shoda a zobrazení vzoru v řetězci
Metodu Execute můžete použít k přiřazení jedné nebo všech instancí vzoru v řetězci. Následující kód ukazuje, jak porovnat a zobrazit všechny instance vzoru z řetězce:
123456789101112131415161718 | SubregexMatchingAndDisplayingAPattern ()Dim stringJeden jako řetězecDim regexOne jako objektNastavit regexOne = New RegExpregexOne.Pattern = "A.C"regexOne.Global = TrueregexOne.IgnoreCase = IgnoreCasestringOne = "ABC-A1289C-ADC-A1289C-AJC"Nastavte theMatches = regexOne.Execute (stringOne)Za každý zápas v zápasechDebug.Print Match.ValuedalšíEnd Sub |
Výsledek je:
Řekněme, že jsme z výše uvedeného řetězce chtěli spojit pouze -ADC-. Následující kód ukazuje, jak z řetězce porovnat a zobrazit pouze -ADC-:
123456789101112131415161718 | SubregexMatchingAndDisplayingAPattern ()Dim stringJeden jako řetězecDim regexOne jako objektNastavit regexOne = New RegExpregexOne.Pattern = "\-\ A.C \-"regexOne.Global = FalseregexOne.IgnoreCase = IgnoreCasestringOne = "ABC-A1289C-ADC-A1289C-AEC"Nastavte theMatches = regexOne.Execute (stringOne)Za každý zápas v zápasechDebug.Print Match.ValuedalšíEnd Sub |
Učení regexu může nějakou dobu trvat, ale je to extrémně účinný nástroj pro identifikaci/manipulaci s řetězci textu. Je také široce používán v programovacích jazycích.