Wyrażenia regularne są używane do dopasowania wzorca.
Aby użyć w programie Excel, wykonaj następujące kroki:
Krok 1 : Dodaj odniesienie VBA do „Wyrażeń regularnych Microsoft VBScript 5.5”
- Wybierz kartę „Deweloper” ( nie mam tej karty, co mam zrobić? )
- Wybierz ikonę „Visual Basic” z sekcji wstążki „Kod”
- W oknie „Microsoft Visual Basic for Applications” wybierz „Narzędzia” z górnego menu.
- Wybierz „Referencje”
- Zaznacz pole obok „Microsoft VBScript Regular Expressions 5.5”, aby dołączyć do skoroszytu.
- Kliknij OK"
Krok 2 : Zdefiniuj swój wzór
Podstawowe definicje:
-
Zasięg.
- Np.
a-z
Dopasowuje małe litery od a do z
- Np.
0-5
Pasuje do dowolnej liczby od 0 do 5
[]
Dopasuj dokładnie jeden z obiektów w tych nawiasach.
- Np.
[a]
Pasuje do litery a
- Np.
[abc]
Pasuje do jednej litery, która może być a, b lub c
- Np.
[a-z]
Pasuje do dowolnej małej litery alfabetu.
()
Grupuje różne dopasowania do celów zwrotu. Zobacz przykłady poniżej.
{}
Mnożnik dla powtarzających się kopii zdefiniowanego wcześniej wzoru.
- Np.
[a]{2}
Pasuje do dwóch kolejnych małych liter a:aa
- Np
[a]{1,3}
pasuje co najmniej jeden, a maksymalnie trzy niższe literę a
, aa
,aaa
+
Dopasuj co najmniej jeden lub więcej wcześniej zdefiniowanych wzorów.
- Np
a+
dopasuje rzędu A w a
, aa
, aaa
, i tak dalej
?
Dopasuj zero lub jeden ze zdefiniowanych wcześniej wzorców.
- Np. Wzorzec może, ale nie musi być obecny, ale można go dopasować tylko raz.
- Np.
[a-z]?
Dopasowuje pusty ciąg lub dowolną małą literę.
*
Dopasuj zero lub więcej wzorca zdefiniowanego przed nim. - Np. Symbol wieloznaczny dla wzoru, który może, ale nie musi być obecny. - Np. [a-z]*
Dopasowuje pusty ciąg lub ciąg małych liter.
.
Pasuje do dowolnego znaku z wyjątkiem znaku nowej linii \n
- Np.
a.
Dopasowuje ciąg dwóch znaków rozpoczynający się od a, a kończący na czymkolwiek oprócz\n
|
LUB operator
- Np.
a|b
Oznacza albo a
albo b
można je dopasować.
- Np.
red|white|orange
Pasuje dokładnie do jednego z kolorów.
^
NIE operator
- Np.
[^0-9]
Znak nie może zawierać liczby
- Np.
[^aA]
Znak nie może być małymi a
lub dużymi literamiA
\
Ucieka specjalnemu znakowi, który następuje (przesłania powyższe zachowanie)
Wzory kotwiczenia:
^
Dopasowanie musi nastąpić na początku łańcucha
- Np.
^a
Pierwszy znak musi być małą literąa
- Np.
^[0-9]
Pierwszy znak musi być liczbą.
$
Dopasowanie musi nastąpić na końcu ciągu
- Np.
a$
Ostatni znak musi być małą literąa
Tabela pierwszeństwa:
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
Predefiniowane skróty postaci:
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
Przykład 1 : Uruchom jako makro
Poniższe przykładowe makro sprawdza wartość w komórce, A1
aby sprawdzić, czy pierwsze 1 lub 2 znaki są cyframi. Jeśli tak, są one usuwane, a reszta łańcucha jest wyświetlana. Jeśli nie, pojawi się okno z informacją, że nie znaleziono dopasowania. A1
Wartości komórek 12abc
zwrócą abc
, wartość 1abc
zwrócą abc
, wartość abc123
zwrócą „Niepasujące”, ponieważ cyfry nie były na początku łańcucha.
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
Przykład 2 : Uruchom jako funkcję w komórce
Ten przykład jest taki sam jak w przykładzie 1, ale jest skonfigurowany do działania jako funkcja w komórce. Aby użyć, zmień kod na ten:
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
Umieść swoje ciągi („12abc”) w komórce A1
. Wprowadź tę formułę =simpleCellRegex(A1)
w komórce, B1
a wynikiem będzie „abc”.
Przykład 3 : Pętla przez zakres
Ten przykład jest taki sam jak w przykładzie 1, ale przechodzi przez szereg komórek.
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
Przykład 4 : Rozdzielanie różnych wzorów
W tym przykładzie pętla przechodzi przez zakres ( A1
, A2
& A3
) i wyszukuje ciąg rozpoczynający się od trzech cyfr, po których następuje pojedynczy znak alfa, a następnie 4 cyfry. Dane wyjściowe dzielą dopasowania wzorca na sąsiednie komórki za pomocą ()
. $1
reprezentuje pierwszy wzór dopasowany w pierwszym zestawie ()
.
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
Wyniki:
Dodatkowe przykłady wzorów
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