Come utilizzare le espressioni regolari (Regex) in Microsoft Excel sia in-cell che in loop


592

Come posso usare le espressioni regolari in Excel e sfruttare la potente configurazione a griglia di Excel per la manipolazione dei dati?

  • Funzione in cella per restituire un modello corrispondente o valore sostituito in una stringa.
  • Sottotitoli in sequenza attraverso una colonna di dati ed estrai corrispondenze a celle adiacenti.
  • Quale installazione è necessaria?
  • Quali sono i caratteri speciali di Excel per le espressioni regolari?

Capisco Regex non è l'ideale per molte situazioni ( per uso o di non usare le espressioni regolari? ) In quanto Excel può utilizzare Left, Mid, Right, Instri comandi di tipo per manipolazioni simili.


11
Consiglio vivamente questo articolo VB / VBA Regexp di Patrick Matthews
brettdj,

1
Prova questo componente aggiuntivo gratuito: seotoolsforexcel.com/regexpfind
Niels Bosma

1
Non dimentichiamo l' Like operatore , che fornisce una sorta di versione leggera della funzionalità in stile regex. In genere è molto più veloce di regex, anche se racchiuso in una procedura secondaria o di funzione.
Egalth,

Risposte:


955

Le espressioni regolari vengono utilizzate per la corrispondenza dei modelli.

Per utilizzare in Excel attenersi alla seguente procedura:

Passaggio 1 : aggiungi il riferimento VBA a "Microsoft VBScript Regular Expressions 5.5"

  • Seleziona la scheda "Sviluppatore" ( Non ho questa scheda cosa devo fare? )
  • Selezionare l'icona "Visual Basic" dalla sezione della barra multifunzione "Codice"
  • Nella finestra "Microsoft Visual Basic, Applications Edition" selezionare "Strumenti" dal menu in alto.
  • Seleziona "Riferimenti"
  • Seleziona la casella accanto a "Microsoft VBScript Regular Expressions 5.5" da includere nella cartella di lavoro.
  • Fai clic su "OK"

Passaggio 2 : definire il modello

Definizioni di base:

- Gamma.

  • Ad esempio, a-zcorrisponde a lettere minuscole dalla a alla z
  • Ad esempio, 0-5corrisponde a qualsiasi numero compreso tra 0 e 5

[] Abbina esattamente uno degli oggetti all'interno di queste parentesi.

  • Ad esempio [a]corrisponde alla lettera a
  • Ad esempio, [abc]corrisponde a una singola lettera che può essere a, b o c
  • Ad esempio, [a-z]corrisponde a qualsiasi singola lettera minuscola dell'alfabeto.

()Raggruppa partite diverse a scopo di restituzione. Vedi esempi di seguito.

{} Moltiplicatore per copie ripetute del modello definito prima.

  • Ad esempio, [a]{2}corrisponde a due lettere consecutive minuscole a:aa
  • Ad esempio, [a]{1,3}corrisponde ad almeno uno e fino a tre lettera minuscola a, aa,aaa

+ Abbina almeno uno, o più, del modello definito prima di esso.

  • Ad esempio, a+corrisponderà consecutivo una di a, aa, aaae così via

? Abbina zero o uno dei pattern definiti prima.

  • Ad esempio, il modello può essere presente o meno, ma può essere associato solo una volta.
  • Ad esempio, [a-z]?corrisponde a una stringa vuota o a una singola lettera minuscola.

* Corrisponde a zero o più del modello definito prima. - Ad esempio, carattere jolly per motivi che potrebbero essere presenti o meno. - Ad esempio, [a-z]*corrisponde a una stringa vuota o una stringa di lettere minuscole.

. Corrisponde a qualsiasi personaggio tranne Newline \n

  • Ad esempio a.Corrisponde a una stringa di due caratteri che inizia con a e termina con qualsiasi cosa tranne\n

| Operatore OR

  • Ad esempio a|bsignifica che ao bpuò essere abbinato.
  • Ad esempio, red|white|orangecorrisponde esattamente a uno dei colori.

^ NON operatore

  • Ad esempio, il [^0-9]carattere non può contenere un numero
  • Ad esempio, il [^aA]carattere non può essere in minuscolo ao maiuscoloA

\ Sfugge al carattere speciale che segue (ignora il comportamento sopra)

  • Ad esempio \., \\, \(, \?, \$,\^

Schemi di ancoraggio:

^ La corrispondenza deve verificarsi all'inizio della stringa

  • Ad esempio, il ^aprimo carattere deve essere una lettera minuscolaa
  • Ad esempio, il ^[0-9]primo carattere deve essere un numero.

$ La corrispondenza deve avvenire alla fine della stringa

  • Ad esempio, l' a$ultimo carattere deve essere una lettera minuscolaa

Tabella di precedenza:

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

Abbreviazioni di caratteri predefinite:

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

Esempio 1 : Esegui come macro

La seguente macro di esempio esamina il valore nella cella A1per vedere se i primi 1 o 2 caratteri sono cifre. In tal caso, vengono rimossi e viene visualizzato il resto della stringa. In caso contrario, viene visualizzata una finestra in cui viene indicato che non è stata trovata alcuna corrispondenza. I A1valori delle celle di 12abcrestituiranno abc, il valore di 1abcrestituirà abc, il valore di abc123restituirà "Non abbinato" perché le cifre non erano all'inizio della stringa.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

Esempio 2 : Esegui come funzione nella cella

Questo esempio è uguale all'esempio 1 ma è configurato per essere eseguito come una funzione in-cell. Per usare, cambia il codice in questo:

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String


    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

Posiziona le stringhe ("12abc") nella cella A1. Inserisci questa formula =simpleCellRegex(A1)nella cella B1e il risultato sarà "abc".

immagine dei risultati


Esempio 3 : Loop Through Range

Questo esempio è uguale all'esempio 1 ma scorre in un intervallo di celle.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

Esempio 4 : dividere modelli diversi

Questo esempio scorre in un intervallo ( A1, A2& A3) e cerca una stringa che inizia con tre cifre seguite da un singolo carattere alfa e quindi da 4 cifre numeriche. L'output divide le corrispondenze del modello in celle adiacenti utilizzando il (). $1rappresenta il primo modello corrispondente all'interno del primo set di ().

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

risultati:

immagine dei risultati


Esempi di pattern aggiuntivi

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit

22
Non dovresti dimenticare di Set regEx = Nothing. Otterrai eccezioni di memoria esaurita, quando quel sub viene eseguito abbastanza frequentemente.
Kiril,

1
Ho adattato esempio 4 con SubMatches nel trattamento regex più complesso, sostanzialmente non uso sostituire quando scissione, se qualcuno è interessato: stackoverflow.com/questions/30218413/...
Armfoot

11
Set regEx = CreateObject("VBScript.RegExp")
Rilegatura in

2
Ok, sono abbastanza sicuro che sia perché il codice è inserito ThisWorkbook. Prova a spostare il codice in un altro Module.
Portland Runner,

3
@PortlandRunner nel "project explorer" (?) Questo file Excel mancava di una sottocartella "Modules", sebbene un altro file ne mostrasse uno. Fai clic con il pulsante destro del mouse sul file e scegli "inserisci modulo", quindi fai doppio clic su "Modulo 1" e incolla il codice. Salvato. Torna alla cartella di lavoro e digita nuovamente la funzione: ha funzionato. Potrebbe essere degno di nota nella risposta, per il bene degli inesperti come me? Grazie per l'aiuto.
youcantryreachingme,

205

Per utilizzare le espressioni regolari direttamente nelle formule di Excel, può essere utile il seguente UDF (funzione definita dall'utente). Espone più o meno direttamente la funzionalità di espressione regolare come una funzione excel.

Come funziona

Ci vogliono 2-3 parametri.

  1. Un testo su cui usare l'espressione regolare.
  2. Un'espressione regolare.
  3. Una stringa di formato che specifica l'aspetto del risultato. Può contenere $0, $1, $2, e così via. $0è l'intera corrispondenza $1e su corrisponde ai rispettivi gruppi di corrispondenza nell'espressione regolare. L'impostazione predefinita è $0.

Qualche esempio

Estrarre un indirizzo email:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

Risultati in: some@email.com

Estrarre diverse sottostringhe:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

Risultati in: E-Mail: some@email.com, Name: Peter Gordon

Per smontare una stringa combinata in una singola cella nei suoi componenti in più celle:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

Risultati in: Peter Gordon some@email.com...

Come usare

Per utilizzare questo UDF, procedi come segue (approssimativamente in base a questa pagina Microsoft . Hanno alcune buone informazioni aggiuntive lì!):

  1. In Excel in un file abilitato per Macro ('.xlsm') premere ALT+F11per aprire l' Editor di Microsoft Visual Basic, Applications Edition.
  2. Aggiungi il riferimento VBA alla libreria delle espressioni regolari (copiata spudoratamente dalla risposta Portland Runners ++ ):
    1. Fai clic su Strumenti -> Riferimenti (scusa lo screenshot tedesco) Strumenti -> Riferimenti
    2. Trova Microsoft VBScript Regular Expressions 5.5 nell'elenco e spunta la casella accanto ad essa.
    3. Clicca OK .
  3. Fai clic su Inserisci modulo . Se dai al tuo modulo un nome diverso, assicurati che il Modulo non abbia lo stesso nome dell'UDF in basso (ad es. Nominare il Modulo Regexe la funzione regexcausa errori #NOME! ).

    Seconda icona nella riga dell'icona -> Modulo

  4. Nella grande finestra di testo al centro inserire quanto segue:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Salvare e chiudere la finestra dell'editor di Microsoft Visual Basic, Applications Edition.


6
Questa risposta combinata con i passaggi qui per creare un componente aggiuntivo, è stata molto utile. Grazie. Assicurati di non dare al tuo modulo e di avere lo stesso nome!
Chris Hunt,

2
Ribadendo il commento sopra di Chris Hunt. Non chiamare anche il tuo modulo "Regex". Pensavo di impazzire per un po 'perché la funzione non funzionava a causa di un errore # NOME
Chris,

Bene, sono impazzito mentre ho provato di tutto (incluso la modifica di moduli / nomi) e ancora ricevo l'errore #NAME
Enissay

@Enissay: prova a creare un Function foo() As Variant \n foo="Hello World" \n End FunctionUDF minimo per vedere se funziona. In caso affermativo, procedi fino in fondo, se non c'è qualcosa di basilare rotto (macro disabilitata?).
Patrick Böker,


64

Ampliare la risposta di Patszim per coloro che hanno fretta.

  1. Apri cartella di lavoro di Excel.
  2. Alt+ F11per aprire la finestra VBA / Macro.
  3. Aggiungi riferimento a regex in Strumenti, quindi Riferimenti
    ! [Excel VBA Form aggiunge riferimenti
  4. e selezionando Microsoft VBScript Regular Expression 5.5
    ! [Excel VBA aggiunge il riferimento regex
  5. Inserisci un nuovo modulo (il codice deve risiedere nel modulo altrimenti non funziona).
    ! [Modulo di inserimento codice VBA Excel
  6. Nel modulo appena inserito,
    ! [Excel VBA inserire il codice nel modulo
  7. aggiungi il seguente codice:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
  8. Il modello regex viene inserito in una delle celle e su di esso viene utilizzato il riferimento assoluto . ! [Funzione regex di Excel nell'utilizzo all'interno della cella La funzione sarà legata alla cartella di lavoro in cui è stata creata.
    Se è necessario utilizzarla in diverse cartelle di lavoro, archiviare la funzione in Personal.XLSB


1
Grazie per averlo menzionato, deve essere in Personal.xlsb per essere disponibile in tutti i documenti Excel su cui lavori. La maggior parte delle (?) Altre risposte non lo chiariscono. Personal.XLSB andrebbe nella cartella (potrebbe essere necessario creare la cartella) C: \ Users \ nome utente \ AppData \ Local \ Microsoft \ Excel \ XLStart cartella
Mark Stewart

26

Ecco il mio tentativo:

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.

        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If

    End With
End Function

9

Avevo bisogno di usarlo come una funzione cellulare (come SUMo VLOOKUP) e ho scoperto che era facile:

  1. Assicurati di essere in un file Excel abilitato per le macro (salva come xlsm).
  2. Apri strumenti di sviluppo Alt+F11
  3. Aggiungi Microsoft VBScript Regular Expressions 5.5 come in altre risposte
  4. Creare la seguente funzione nella cartella di lavoro o nel suo modulo:

    Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
        Dim regex As New VBScript_RegExp_55.RegExp
        Dim strInput As String
    
        strInput = myRange.Value
    
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        REGPLACE = regex.Replace(strInput, outputPattern)
    
    End Function
  5. Quindi puoi utilizzare nella cella con =REGPLACE(B1, "(\w) (\d+)", "$1$2")(es: "A 243" a "A243")


Questa denominazione di outputPattern mi ha lasciato senza parole. È il valore di sostituzione.
Thor,

1
Sì. Suppongo di aver lasciato il modello chiamato, quindi era chiaro che non si trattava solo di una sostituzione di stringhe e che potevi usare gruppi di corrispondenza regex come $ 1 $ 2 ecc.
DeezCashews

7

Questa non è una risposta diretta ma può fornire un'alternativa più efficiente alla tua considerazione. Il che significa che Google Sheets ha diverse funzioni Regex integrate che possono essere molto convenienti e aiutare a eludere alcune delle procedure tecniche in Excel. Ovviamente ci sono alcuni vantaggi nell'usare Excel sul tuo PC, ma per la stragrande maggioranza degli utenti Google Sheets offrirà un'esperienza identica e potrebbe offrire alcuni vantaggi in termini di portabilità e condivisione dei documenti.

Loro offrono

REGEXEXTRACT: estrae le sottostringhe corrispondenti secondo un'espressione regolare.

REGEXREPLACE: sostituisce parte di una stringa di testo con una stringa di testo diversa usando espressioni regolari.

SOSTITUTIVO: sostituisce il testo esistente con nuovo testo in una stringa.

SOSTITUISCI: sostituisce parte di una stringa di testo con una stringa di testo diversa.

Puoi digitarli direttamente in una cella in questo modo e produrre ciò che desideri

=REGEXMATCH(A2, "[0-9]+")

Funzionano anche abbastanza bene in combinazione con altre funzioni come le istruzioni IF in questo modo:

=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

inserisci qui la descrizione dell'immagine

Speriamo che questo fornisca una soluzione semplice per gli utenti che si sentono provocati dal componente VBS di Excel.


Grazie per aver condiviso Alex. Questo è utile per chi cerca la versione di Google. Potresti prendere in considerazione la possibilità di scrivere e rispondere a un'altra domanda specifica di Google Sheets Regex in quanto ha una sua nomenclatura e sarebbe molto utile per gli altri. Indipendentemente da ciò, hai il mio voto!
Portland Runner,

4

Ecco una regex_subst()funzione. Esempi:

=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo

Ecco il codice semplificato (comunque più semplice per me). Non riuscivo a capire come costruire un modello di output adatto usando quanto sopra per funzionare come i miei esempi:

Function regex_subst( _
     strInput As String _
   , matchPattern As String _
   , Optional ByVal replacePattern As String = "" _
) As Variant
    Dim inputRegexObj As New VBScript_RegExp_55.RegExp

    With inputRegexObj
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = matchPattern
    End With

    regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function

1

Non voglio abilitare una libreria di riferimento poiché ho bisogno che i miei script siano portabili. La Dim foo As New VBScript_RegExp_55.RegExplinea ha causato User Defined Type Not Definederrori, ma ho trovato una soluzione che ha funzionato per me.

Quello che vorrai fare è mettere una stringa di esempio nella cella A1, quindi testare il tuo strPattern. Una volta che funziona, regola rngcome desiderato.

Public Sub RegExSearch()
'/programming/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
    Dim regexp As Object
    'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
    Dim rng As Range, rcell As Range
    Dim strInput As String, strPattern As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = ActiveSheet.Range("A1:A1")

    strPattern = "([a-z]{2})([0-9]{8})"
    'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

    For Each rcell In rng.Cells

        If strPattern <> "" Then
            strInput = rcell.Value

            If regexp.test(strInput) Then
                MsgBox rcell & " Matched in Cell " & rcell.Address
            Else
                MsgBox "No Matches!"
            End If
        End If
    Next
End Sub

Non voglio abilitare una libreria di riferimento in quanto ho bisogno che i miei script siano portatili : la VBScript_RegExp_55libreria è praticamente onnipresente, quindi comporta un rischio molto basso di non trovarsi su un determinato computer di destinazione. E comunque, il passaggio da Early Bound a Late Bound non risolve il problema della portabilità (il codice continuerà a errore, solo in fase di esecuzione anziché in fase di compilazione)
chris neilsen,

1
No, non è affatto vero, questo script può essere condiviso con un altro utente senza che abiliti nulla di portatile. Grazie comunque
FreeSoftwareServers il

1
Certo, ma il codice RegEx non sarà utilizzabile . Se il materiale RegEx fa parte di una cartella di lavoro di una biblioteca più grande, immagino che non abbia generato un errore di compilazione, pertanto consentire l'utilizzo di altre parti potrebbe essere considerato utile
chris neilsen,

1

Per aggiungere al prezioso contenuto, vorrei creare questo promemoria sul perché a volte RegEx all'interno di VBA non è l'ideale. Non tutte le espressioni sono supportate, ma invece potrebbero lanciarne una Error 5017e lasciare che l'autore indovini (di cui sono vittima di me stesso).

Mentre possiamo trovare alcune fonti su ciò che è supportato, sarebbe utile sapere quali metacaratteri ecc. Non sono supportati. Una spiegazione più approfondita può essere trovata qui . Menzionato in questa fonte:

"Sebbene" l'espressione regolare di VBScript ... la versione 5.5 implementa alcune funzioni regex essenziali che mancavano nelle versioni precedenti di VBScript. ... JavaScript e VBScript implementano espressioni regolari in stile Perl. Tuttavia, mancano un certo numero di funzionalità avanzate disponibili in Perl e in altri gusti moderni di espressioni regolari: "


Quindi, non supportati sono:

  • Inizio dell'ancoraggio della stringa \A, in alternativa usa il ^cursore per abbinare la posizione prima del 1 ° carattere nella stringa
  • End of String ancor \Z, in alternativa usa il $simbolo del dollaro per abbinare la posizione dopo l'ultimo carattere nella stringa
  • LookBehind positivo, ad es .: (?<=a)b(mentre è supportato LookAhead postivo )
  • LookBehind negativo, ad es .: (?<!a)b(mentre è supportato LookAhead negativo )
  • Raggruppamento atomico
  • Quantificatori possessivi
  • Unicode ad es .: \{uFFFF}
  • Gruppi di acquisizione nominati . In alternativa, utilizzare Gruppi di acquisizione numerati
  • Modificatori incorporati, ad esempio: /i(case sensitive) o /g(global) ecc. Impostali tramite le RegExpproprietà dell'oggetto> RegExp.Global = Truee, RegExp.IgnoreCase = Truese disponibili.
  • Condizionali
  • Commenti sulle espressioni regolari . Aggiungi questi con 'commenti regolari nello script

Ho già colpito un muro più di una volta usando espressioni regolari all'interno di VBA. Di solito con LookBehindma a volte dimentico persino i modificatori. Non ho sperimentato tutti questi sfondi sopra menzionati, ma ho pensato che avrei cercato di essere esteso facendo riferimento ad alcune informazioni più approfondite. Sentiti libero di commentare / correggere / aggiungere. Grida a regolari-expressions.info per una grande quantità di informazioni.

PS Hai menzionato i metodi e le funzioni VBA regolari e posso confermare che (almeno per me) sono stati utili nei loro modi in cui RegEx avrebbe fallito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.