Этого еще не нужно, но когда я использовал консольное приложение для быстрых тестов и требуемого async, я просто решил его следующим образом:
class Program
{
static void Main(string[] args)
{
MainAsync(args).Wait();
}
static async Task MainAsync(string[] args)
{
// Code here
}
}
Регулярные выражения используются для сопоставления шаблонов.
Чтобы использовать в Excel, выполните следующие действия:
Шаг 1: добавьте ссылку VBA на «Microsoft VBScript Regular Expressions 5.5»
Шаг 2: Определите свой шаблон
Основные определения:
-
Диапазон.
a-z
соответствует строчным буквам от a до z 0-5
соответствует любому числу от 0 до 5 []
Сопоставьте ровно один из объектов внутри этих скобок.
[a]
соответствует букве a [abc]
соответствует одной букве, которая может быть a, b или c [a-z]
соответствует любой отдельной строчной букве алфавита. ()
Группы разных совпадений для целей возврата. См. Примеры ниже.
{}
Множитель для повторных копий шаблона, определенных перед ним.
[a]{2}
соответствует двум последовательным строчным буквам a: aa
[a]{1,3}
соответствует по меньшей мере одной и до трех строчных букв a
, aa
, aaa
+
Сопоставьте хотя бы один или более шаблон определенную перед ним.
a+
будет соответствовать последовательностям a a
, aa
, aaa
и т. д. ?
Сопоставьте нуль или один из шаблонов, определенных перед ним.
[a-z]?
соответствует пустой строке или любой отдельной строчной букве. *
Сопоставьте нулевой или более шаблон, определенный перед ним. -. Подстановочный шаблон для шаблона, который может быть или не быть. -. [a-z]*
соответствует пустой строке или строке строчных букв.
.
Соответствует любому символу, кроме новой строки \n
a.
Соответствует двухсимвольной строке, начинающейся с a и заканчивающейся чем угодно, кроме \n
|
OR operator
a|b
означает, что можно выбрать a
или b
. red|white|orange
соответствует точно одному из цветов. ^
Оператор NOT
[^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».
[/g9]
Пример 3: Loop Through Range
Этот пример аналогичен примеру 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
& amp; 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
Результаты:
[/g10]
Дополнительные примеры шаблонов
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
Мне нужно было использовать это как функцию ячейки (например, SUM
или VLOOKUP
) и обнаружил, что это легко:
Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
Dim regex As New VBScript_RegExp_55.RegExp
Dim strInput As String
strInput = myRange.Value
With regex
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
REGPLACE = regex.Replace(strInput, outputPattern)
End Function
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(например: «A 243» - «A243») Чтобы использовать регулярные выражения непосредственно в формулах Excel, может помочь следующая UDF (функция, определенная пользователем).
Он принимает 2-3 параметра.
$0
, $1
, $2
и т. Д. $0
- это полное совпадение, $1
и up соответствуют соответствующим группам совпадений в регулярном выражении. По умолчанию $0
. Извлечение адреса электронной почты:
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")
Результаты в: some@email.com
Извлечение нескольких подстрок:
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")
Результаты в: E-Mail: some@email.com, Name: Peter Gordon
Чтобы разделить объединенную строку в одной ячейке на ее компоненты в нескольких ячейках:
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)
Результаты в: Peter Gordon
some@email.com
...
Чтобы использовать этот UDF, выполните следующие действия (примерно на основе этой страницы Microsoft . У них есть дополнительная дополнительная информация!):
ALT+F11
, чтобы открыть Редактор Microsoft Visual Basic для приложений . Regex
, а функция regex
вызывает #NAME! ). [/g15] Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
Dim replaceNumber As Integer
With inputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = matchPattern
End With
With outputRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "\$(\d+)"
End With
With outReplaceRegexObj
.Global = True
.MultiLine = True
.IgnoreCase = False
End With
Set inputMatches = inputRegexObj.Execute(strInput)
If inputMatches.Count = 0 Then
regex = False
Else
Set replaceMatches = outputRegexObj.Execute(outputPattern)
For Each replaceMatch In replaceMatches
replaceNumber = replaceMatch.SubMatches(0)
outReplaceRegexObj.Pattern = "\$" & replaceNumber
If replaceNumber = 0 Then
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
Else
If replaceNumber > inputMatches(0).SubMatches.Count Then
'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
regex = CVErr(xlErrValue)
Exit Function
Else
outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
End If
End If
Next
regex = outputPattern
End If
End Function
Расширение на patszim ответ для тех, кто спешит.
Function RegxFunc(strInput As String, regexPattern As String) As String
Dim regEx As New RegExp
With regEx
.Global = True
.MultiLine = True
.IgnoreCase = False
.pattern = regexPattern
End With
If regEx.Test(strInput) Then
Set matches = regEx.Execute(strInput)
RegxFunc = matches(0).Value
Else
RegxFunc = "not matched"
End If
End Function
Set regEx = Nothing
. Вы получите исключения из памяти, если этот Sub выполняется достаточно часто. – Kiril 13 March 2015 в 11:28Set regEx = CreateObject("VBScript.RegExp")
– ZygD 5 December 2015 в 12:23