Страницы: 1
RSS
Регулярные выражения. Применение некоторых символов в паттернах
 
Здравствуйте
Вчера в теме  Регулярные выражения. Почему в коллекции 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}"
Не могу до конца прочитать первое выражение в квадратных скобках. Латиница верхний регистр, цифры, точка, знак подчеркивания, а дальше ступор, не знаю что обозначает знак проценты и нигде на сайтах не нашел, видимо не умею пользоваться инетом.
Помогите пожалуйста разобраться
Файл не стал прикреплять наверно он не нужен или можно взять с вчерашней темы
Изменено: Евгений Смирнов - 21.12.2021 06:34:36
 
Немного нарушил правила форума. Вчера не поискал ответы в темах здесь. Сегодня исправился, но нашел только это Что означает "?:" в регулярном выражении?
На там по моему мнению дан неверный ответ.
Изменено: Евгений Смирнов - 21.12.2021 07:54:51
 
Скобки: это группировка выражений. В основном для удобства, но при этом скобки так же влияют и на отбор в 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. А знак процента допускается в имени эл.адреса почты.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков Большущее спасибо за ответ. Но я сразу не могу его переварить. Буду разбираться
 
Евгений Смирнов, здравствуйте
Боюсь,, вот так сходу ничего у вас выяснить не получится — RegExp порой невероятно сложная и неоднозначная штука, всегда требующая постоянной практики, иначе забывается. На форуме мало спецов по действительно сложным шаблонам - мне на ум приходят только (простите, если кого забыл) Андрей VG и sokol92 и даже им приходится перебирать и пробовать

Вот пример сложных шаблонов (у есть ещё несколько тем по RegExp - ищите по ключу "регуляр")

UPD: Как я мог Дмитрия забыть — он же собаку съел на них  :D
Изменено: Jack Famous - 21.12.2021 09:29:27
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous Здравствуйте Спасибо за ваш ответ
 

Да 3 вопрос можно было не задавать, но надеюсь не расстреляют за это. Просто никогда не видел адресов Эл почты с символом проценты, поэтому  меня заклинило. Еще раз огромное спасибо Дмитрию Щербакову за подробный ответ. Полностью разобрался с этими вопросами. Наверное надо делать справочный файл, потому что эта конструкция «?:» ведет себя по разному и вероятно есть и другие.

 
Цитата
Евгений Смирнов: надо делать справочный файл
Объект RegExp

Цитата
Евгений Смирнов: ведет себя по разному
Цитата
Jack Famous: RegExp порой невероятно сложная и неоднозначная штука
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous Я когда-то заходил вроде на этот сайт, но тогда мне не надо было. Сегодня разбирался с ответом Дмитрия. Завтра утречком, более внимательно прочитаю статью по вашей ссылке. Сейчас мельком глянул похоже есть некоторые полезные вещи

Хорошая ссылка. (Я хоть стал понимать о чем там пишут). Но надо больше времени, чтобы все переварить.
Изменено: Евгений Смирнов - 21.12.2021 18:28:40
 
процесс написания паттерна для РегЕхр вполне сравним с написанием макроса в VBA
вы на придуманном кем-то языке пишете совершенно бессмысленные (с точки зрения не понимающих в этом людей) последовательности символов, выполнив которые понимающая их машина выдаст вам ожидаемый результат.
макрос как и паттерн - он решает поставленную задачу или не решает, только в случае с макросами у вас есть средства отладки, пошаговый режим и пр.
а в случае с РегЕхр - только конечный результат (получилось, не получилось)
у РегЕхр очень узкая специализация и сравнительно небольшой набор управляющих символов, но... никаких способов отследить а что же там происходит внутри, почему все пошло не так, как ожидалось
+ будете читать описание RegExp читайте описание именно для VBA, у разных RegExp-ов при множестве общих подходов есть свои особенности реализации, поэтому написанный где-то пример паттерна не обязательно корректно сработает для VBA RegExp(((
 
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Почему-то не упомянуты вот эти замечательные ссылки:
https://regex101.com/
https://habr.com/ru/post/545150/
 
nilske К сожалению не владею английским, поэтому по 1 ссылке наверное ничего не пойму. 2 обязательно прочитаю. Спасибо
По второй ссылке статья для начинающих можно почитать
По моему мнению это для другого языка(не для VBA) поэтому символьные классы можно пропустить
Изменено: Евгений Смирнов - 22.12.2021 13:36:07
 
Цитата
Евгений Смирнов написал:
К сожалению не владею английским, поэтому по 1 ссылке наверное ничего не пойму.
Это не инструкция по эксплуатации, это тестер!
Страницы: 1
Наверх