Регулярные выражения используются для сопоставления с образцом.
Чтобы использовать в Excel, выполните следующие действия:
Шаг 1. Добавьте ссылку на VBA в «Регулярные выражения Microsoft VBScript 5.5»
- Выберите вкладку «Разработчик» ( у меня нет этой вкладки, что мне делать? )
- Выберите значок «Visual Basic» в разделе ленты «Код»
- В окне «Microsoft Visual Basic для приложений» выберите «Инструменты» в верхнем меню.
- Выберите «Рекомендации»
- Установите флажок «Регулярные выражения Microsoft VBScript 5.5», чтобы включить его в свою книгу.
- Нажмите "ОК"
Шаг 2 : Определите свой шаблон
Основные определения:
-
Спектр.
- Например,
a-z
соответствует строчным буквам от а до я
- Например,
0-5
соответствует любое число от 0 до 5
[]
Совпадение точно с одним из объектов в этих скобках.
- Например,
[a]
соответствует букве а
- Например,
[abc]
соответствует одной букве, которая может быть a, b или c
- Например,
[a-z]
соответствует любой строчной букве алфавита.
()
Группы разных совпадений для целей возврата. Смотрите примеры ниже.
{}
Множитель для повторных копий шаблона, определенного перед ним.
- Например,
[a]{2}
соответствует две последовательные строчные буквы:aa
- Например ,
[a]{1,3}
соответствует по крайней мере , один и до три строчной буквы a
, aa
,aaa
+
Сопоставьте хотя бы один или несколько шаблонов, определенных перед ним.
- Например ,
a+
будет соответствовать последовательным элементам а a
, aa
, aaa
и т.д.
?
Совпадение нуля или одного из шаблонов, определенных перед ним.
- Например, шаблон может присутствовать или не присутствовать, но может быть сопоставлен только один раз.
- Например,
[a-z]?
соответствует пустой строке или любой отдельной строчной букве.
*
Сопоставьте ноль или более шаблона, определенного перед ним. - Например, подстановочный знак для шаблона, который может присутствовать или не присутствовать. - Например, [a-z]*
соответствует пустой строке или строке строчных букв.
.
Соответствует любому символу, кроме новой строки \n
- Например,
a.
Соответствует двухсимвольной строке, начинающейся с 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
«Не соответствует», потому что цифры не были в начале строки.
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