Las expresiones regulares se utilizan para la coincidencia de patrones.
Para usar en Excel, siga estos pasos:
Paso 1 : Agregue la referencia de VBA a "Microsoft VBScript Regular Expressions 5.5"
- Seleccione la pestaña "Desarrollador" ( no tengo esta pestaña, ¿qué debo hacer? )
- Seleccione el icono "Visual Basic" de la sección de la cinta 'Código'
- En la ventana "Microsoft Visual Basic para Aplicaciones", seleccione "Herramientas" en el menú superior.
- Seleccione "Referencias"
- Marque la casilla junto a "Microsoft VBScript Regular Expressions 5.5" para incluir en su libro.
- Haga clic en Aceptar"
Paso 2 : define tu patrón
Definiciones basicas:
-
Rango.
- Por ejemplo,
a-z
coincide con letras minúsculas de a a z
- Por ejemplo,
0-5
coincide con cualquier número del 0 al 5
[]
Haga coincidir exactamente uno de los objetos dentro de estos corchetes.
- Por ejemplo,
[a]
coincide con la letra a
- Por ejemplo,
[abc]
coincide con una sola letra que puede ser a, bo c
- Por ejemplo,
[a-z]
coincide con cualquier letra minúscula del alfabeto.
()
Agrupa diferentes coincidencias para propósitos de devolución. Ver ejemplos a continuación.
{}
Multiplicador para copias repetidas del patrón definido antes.
- Por ejemplo,
[a]{2}
coincide con dos letras minúsculas consecutivas a:aa
- Por ejemplo,
[a]{1,3}
coincide con al menos uno y hasta tres letra minúscula a
, aa
,aaa
+
Haga coincidir al menos uno, o más, del patrón definido antes.
- Por ejemplo
a+
coincidirá con una consecutivo de a
, aa
, aaa
, etc.
?
Haga coincidir cero o uno de los patrones definidos antes.
- Por ejemplo, el patrón puede o no estar presente, pero solo puede coincidir una vez.
- Por ejemplo,
[a-z]?
coincide con una cadena vacía o cualquier letra minúscula.
*
Haga coincidir cero o más del patrón definido antes. - Por ejemplo, comodín para un patrón que puede o no estar presente. - Por ejemplo, [a-z]*
coincide con una cadena vacía o una cadena de letras minúsculas.
.
Coincide con cualquier personaje excepto la nueva línea \n
- Por ejemplo,
a.
coincide con una cadena de dos caracteres que comienza con a y termina con cualquier cosa excepto\n
|
Operador OR
- Por ejemplo,
a|b
significa a
o b
puede ser igualado.
- Por ejemplo,
red|white|orange
coincide exactamente con uno de los colores.
^
NO operador
- Por ejemplo, el
[^0-9]
carácter no puede contener un número.
- Por ejemplo, el
[^aA]
carácter no puede ser minúscula a
o mayúsculaA
\
Huye del carácter especial que sigue (anula el comportamiento anterior)
- Por ejemplo
\.
, \\
, \(
, \?
, \$
,\^
Patrones de anclaje:
^
La coincidencia debe ocurrir al comienzo de la cadena
- Por ejemplo, el
^a
primer carácter debe ser minúsculaa
- Por ejemplo, el
^[0-9]
primer carácter debe ser un número.
$
La coincidencia debe ocurrir al final de la cadena
- Por ejemplo, el
a$
último carácter debe ser minúsculaa
Tabla de precedencia:
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
Abreviaturas de caracteres predefinidas:
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
Ejemplo 1 : ejecutar como macro
La siguiente macro de ejemplo examina el valor en la celda A1
para ver si los primeros 1 o 2 caracteres son dígitos. Si es así, se eliminan y se muestra el resto de la cadena. De lo contrario, aparece un cuadro que le indica que no se encontró ninguna coincidencia. Los A1
valores de celda de 12abc
will return abc
, value of 1abc
will return abc
, value of abc123
will return "Not Matched" porque los dígitos no estaban al comienzo de la cadena.
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
Ejemplo 2 : ejecutar como una función en la celda
Este ejemplo es el mismo que el ejemplo 1 pero está configurado para ejecutarse como una función en la celda. Para usar, cambie el código a esto:
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
Coloque sus cadenas ("12abc") en la celda A1
. Ingrese esta fórmula =simpleCellRegex(A1)
en la celda B1
y el resultado será "abc".
Ejemplo 3 : Bucle a través del rango
Este ejemplo es el mismo que el ejemplo 1, pero recorre un rango de celdas.
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
Ejemplo 4 : dividir diferentes patrones
Este ejemplo recorre un rango ( A1
, A2
& A3
) y busca una cadena que comience con tres dígitos seguidos de un solo carácter alfa y luego 4 dígitos numéricos. La salida divide las coincidencias de patrones en celdas adyacentes mediante el uso de ()
. $1
representa el primer patrón que coincide con el primer conjunto de ()
.
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
Resultados:
Ejemplos de patrones adicionales
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