Регулярные выражения используются для сопоставления с образцом.
Чтобы использовать в 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