Здравствуйте Вчера в теме Регулярные выражения. Почему в коллекции Matches нет одного слова. разобрались с моим вопросом, но когда учишься возникают другие. RAN вчера написал паттерн который выводит 3 слова в коллекцию Matches из строки "-word1 -word2 -word3 -word4 -word5"
Код
"(?:\s)\-([a-z0-9]+)(?=\s)"
Вечером разбирался с ним, но к сожалению полностью не смог понять. Метасимволы, квантификаторы, позитивный, негативный просмотр вперед и назад с этими терминами вроде понятно. Но кое что не понятно для меня. 1. Применение круглых скобок. В паттерне RAN их 3. Последние я понимаю нужны. Читал, что ещё они применяются для группировки символов, чтобы применить к группе квантификатор. А в данном случае для чего не понимаю. Те хочу узнать в каких ещё случаях применяются круглые скобки 2. В первой круглой скобке стоит «?:» Только на одном сайте нашел: «Чтобы найденные выражения внутри круглых скобок не попали в результат, следует добавить символы ?: после открывающей скобки». Попробовал убрал 1 и 2 скобки вместе с ?: результат одинаковый. Вообщем не понял, для чего применяются знак вопроса и двоеточие. 3. Я заранее готовился к изучению регулярок и сохранял в файле некоторые макросы с регулярками с сайта. Вчера просмотрел их, стал встречать знакомые буквы в паттернах(значит есть позитивные изменения), но одна незнакомая. Кажется паттерн Кузьмича выдергивание Эл почты
Код
"[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"
Не могу до конца прочитать первое выражение в квадратных скобках. Латиница верхний регистр, цифры, точка, знак подчеркивания, а дальше ступор, не знаю что обозначает знак проценты и нигде на сайтах не нашел, видимо не умею пользоваться инетом. Помогите пожалуйста разобраться Файл не стал прикреплять наверно он не нужен или можно взять с вчерашней темы
Немного нарушил правила форума. Вчера не поискал ответы в темах здесь. Сегодня исправился, но нашел только это Что означает "?:" в регулярном выражении? На там по моему мнению дан неверный ответ.
Скобки: это группировка выражений. В основном для удобства, но при этом скобки так же влияют и на отбор в SubMatches. Например, взять из прошлой темы код и чуть его дополнить:
Код
Sub oRegExp_Test()
Dim re, Item, s As String
Dim oMt As Object, i&
s = "-word1 -word2 -word3 -word4 -word5"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\s\-([a-z0-9]+)\s"
re.Global = True
Set oMt = re.Execute(s)
For Each Item In oMt
Debug.Print "Match item: " & Item.Value
If Item.Submatches.Count Then
Debug.Print vbTab & "SubMatch item count: " & Item.Submatches.Count
For i = 0 To Item.Submatches.Count - 1
Debug.Print vbTab & "- SubMatch item(" & i & ") of " & Item.Value & ": " & Item.Submatches.Item(i)
Next
End If
Next
End Sub
выведет только 1 SubMatch, т.к. в скобках только одно выражение. Дополните паттерн еще скобками: re.Pattern = "\s\-([a-z0-9]+)\s" и получите уже два SubMatches. ?: - я бы назвал это упрощением выражений ИЛИ. Например, если надо найти разные вариации слова "ХОД"(вХОД, выХОД, заХОД и т.д.). То можно записать паттерн так:
Код
Sub oRegExp_Test()
Dim re, Item, s As String
Dim oMt As Object, i&
s = "вход, запасный выход, первый заход, переход, обход"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "(вХОД|выХОД|заХОД)"
re.ignorecase = True
re.Global = True
Set oMt = re.Execute(s)
For Each Item In oMt
Debug.Print "Match item: " & Item.Value
If Item.Submatches.Count Then
Debug.Print vbTab & "SubMatch item count: " & Item.Submatches.Count
For i = 0 To Item.Submatches.Count - 1
Debug.Print vbTab & "- SubMatch item(" & i & ") of " & Item.Value & ": " & Item.Submatches.Item(i)
Next
End If
Next
End Sub
но короче будет именно через ?:
Код
re.Pattern = "(?:в|вы|за)ХОД"
И если выполнить этот паттерн в коде выше, то можно просмотреть так же тот факт, что SubMatches по нему не создаются, в отличии от первого варианта ИЛИ(перечисление полных вариантов через |). Знак % - это знак % Т.е. он означает ровно то, что означает. В квадратных скобках все символы, кроме тире(если тире расположено между двумя символами, которые могут быть расценены как последовательность. Например: 0-9) воспринимаются As is. А знак процента допускается в имени эл.адреса почты.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Евгений Смирнов, здравствуйте Боюсь,, вот так сходу ничего у вас выяснить не получится — RegExp порой невероятно сложная и неоднозначная штука, всегда требующая постоянной практики, иначе забывается. На форуме мало спецов по действительно сложным шаблонам - мне на ум приходят только (простите, если кого забыл) Андрей VG и sokol92 и даже им приходится перебирать и пробовать
Вот пример сложных шаблонов (у есть ещё несколько тем по RegExp - ищите по ключу "регуляр")
UPD: Как я мог Дмитрия забыть — он же собаку съел на них
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Да 3 вопрос можно было не задавать, но надеюсь не расстреляют за это. Просто никогда не видел адресов Эл почты с символом проценты, поэтому меня заклинило. Еще раз огромное спасибо Дмитрию Щербакову за подробный ответ. Полностью разобрался с этими вопросами. Наверное надо делать справочный файл, потому что эта конструкция «?:» ведет себя по разному и вероятно есть и другие.
Jack Famous: RegExp порой невероятно сложная и неоднозначная штука
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Jack Famous Я когда-то заходил вроде на этот сайт, но тогда мне не надо было. Сегодня разбирался с ответом Дмитрия. Завтра утречком, более внимательно прочитаю статью по вашей ссылке. Сейчас мельком глянул похоже есть некоторые полезные вещи
Хорошая ссылка. (Я хоть стал понимать о чем там пишут). Но надо больше времени, чтобы все переварить.
процесс написания паттерна для РегЕхр вполне сравним с написанием макроса в VBA вы на придуманном кем-то языке пишете совершенно бессмысленные (с точки зрения не понимающих в этом людей) последовательности символов, выполнив которые понимающая их машина выдаст вам ожидаемый результат. макрос как и паттерн - он решает поставленную задачу или не решает, только в случае с макросами у вас есть средства отладки, пошаговый режим и пр. а в случае с РегЕхр - только конечный результат (получилось, не получилось) у РегЕхр очень узкая специализация и сравнительно небольшой набор управляющих символов, но... никаких способов отследить а что же там происходит внутри, почему все пошло не так, как ожидалось + будете читать описание RegExp читайте описание именно для VBA, у разных RegExp-ов при множестве общих подходов есть свои особенности реализации, поэтому написанный где-то пример паттерна не обязательно корректно сработает для VBA RegExp(((
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
nilske К сожалению не владею английским, поэтому по 1 ссылке наверное ничего не пойму. 2 обязательно прочитаю. Спасибо По второй ссылке статья для начинающих можно почитать По моему мнению это для другого языка(не для VBA) поэтому символьные классы можно пропустить