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