Для відповідності шаблонів використовуються регулярні вирази .
Для використання в Excel виконайте наступні дії:
Крок 1 : Додайте посилання VBA до "Регулярні вирази Microsoft VBScript 5.5"
- Виберіть вкладку "Розробник" (у мене немає цієї вкладки, що робити? )
- Виберіть піктограму "Visual Basic" у розділі стрічки "Код"
- У вікні "Microsoft Visual Basic для додатків" виберіть "Інструменти" у верхньому меню.
- Виберіть "Посилання"
- Поставте прапорець біля пункту "Регулярні вирази Microsoft VBScript 5.5", який слід включити до вашої робочої книги.
- Натисніть "ОК"
Крок 2 : Визначте свій шаблон
Основні визначення:
-
Дальність.
- Напр.
a-z
Відповідає малі літери від a до z
- Наприклад,
0-5
відповідає будь-якому числу від 0 до 5
[]
Збіжіть точно один із об'єктів всередині цих дужок.
- Напр.
[a]
Відповідає букві а
- Наприклад,
[abc]
відповідає одній букві, яка може бути a, b або c
- Наприклад,
[a-z]
збігається з будь-якою малою літерою алфавіту.
()
Групуйте різні матчі для цілей повернення. Дивіться приклади нижче.
{}
Множник для повторних копій шаблону, визначених перед ним.
- Наприклад,
[a]{2}
збігається з двома послідовними малими літерами a:aa
- Наприклад ,
[a]{1,3}
відповідає принаймні , один і до три малої літери a
, aa
,aaa
+
Збіжіть принаймні один або більше шаблонів, визначених перед ним.
- Наприклад
a+
, відповідатимуть послідовні знаки " a
," aa
, aaa
тощо
?
Зрівняти нуль або один із шаблонів, визначених перед ним.
- Наприклад, шаблон може бути, а може бути, але він може бути узгоджений лише один раз.
- Напр.
[a-z]?
Відповідає порожній рядок або будь-яка маленька літера.
*
Зрівняйте нуль або більше шаблону, визначеного перед ним. - Наприклад, Wildcard для візерунка, який може бути або не присутній. - Наприклад, [a-z]*
відповідає порожній рядок або рядки з малих літер.
.
Відповідає будь-якому символу, крім нового рядка \n
- Напр.
a.
Збіг на двох символьних рядках, починаючи з а і закінчуючи чим-небудь, крім\n
|
АБО оператор
- Напр.,
a|b
Означає a
або b
може бути зіставлений.
- Наприклад,
red|white|orange
відповідає точно одному з кольорів.
^
НЕ оператор
- Напр.
[^0-9]
Символ не може містити число
- Наприклад,
[^aA]
символ не може бути малим a
чи великимA
\
Спеціальний персонаж, що слідує за втечею
- Наприклад
\.
, \\
, \(
, \?
, \$
,\^
Шаблони кріплення:
^
Збіг повинен відбуватися на початку рядка
- Наприклад,
^a
Перший символ повинен бути малою літероюa
- Наприклад,
^[0-9]
Першим символом повинно бути число.
$
Збіг повинен відбуватися в кінці рядка
- Наприклад,
a$
останній символ повинен бути з малої літериa
Таблиця преференцій:
Order Name Representation
1 Parentheses ( )
2 Multipliers ? + * {m,n} {m, n}?
3 Sequence & Anchors abc ^ $
4 Alternation |
Заздалегідь скорочені символи:
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
Приклад 1 : Запустити як макрос
У наступному прикладі макрос розглядає значення в комірці, A1
щоб побачити, чи є перші 1 або 2 символи цифрами. Якщо так, вони видаляються, а решта рядка відображається. Якщо ні, то з'являється вікно, яке говорить про те, що не знайдено відповідності. Клітинні A1
значення 12abc
повернуться abc
, значення 1abc
повернеться abc
, значення abc123
буде повертати «Not Matched» , тому що цифри не були на початку рядка.
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
Приклад 2 : Запустити як внутрішньоклітинну функцію
Цей приклад такий же, як у прикладі 1, але він налаштований на функцію внутрішньої комірки. Для використання змініть код на це:
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
Помістіть ваші рядки ("12abc") у комірку A1
. Введіть цю формулу =simpleCellRegex(A1)
в комірку, B1
і результат буде "abc".
Приклад 3 : Проведіть цикл через діапазон
Цей приклад такий же, як приклад 1, але проходить цикл через діапазон комірок.
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
Приклад 4 : Розщеплення різних моделей
Цей приклад перебирає діапазон ( A1
, A2
& A3
) і шукає рядок, починаючи з трьох цифр, а потім - одного символу альфа, а потім 4 числових цифр. Вихід розбивається на озброєння шаблону на сусідні комірки, використовуючи ()
. $1
являє собою перший візерунок, узгоджений в межах першого набору ()
.
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
Результати:
Додаткові приклади візерунка
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