Страницы: 1
RSS
Регулярные выражения. Почему в коллекции Matches нет одного слова.
 

Здравствуйте

На днях стал знакомиться с регулярками. На одном сайте  при чтении не смог все понять. Есть код

Код
Sub fdsg()
Dim re, Item, s As String
s = "-word1 -word2 -word3 -word4 -word5"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\s\-([a-z0-9]+)\s"
re.Global = True
    For Each Item In re.Execute(s)
        Debug.Print Item.Value
    Next
End Sub

Я так читаю Pattern. Пробел, тире, (латиница в нижнем регистре и цифры) одно или более вхождений, пробел. Но в коллекции Matches получается только два значения

-word2  -word4, а я думаю, что должно быть 3 те  -word3 тоже должно быть. Объясните пожалуйста балбесу, чего я не понимаю.

Изменено: Евгений Смирнов - 20.12.2021 10:42:04
 
Да нет, все верно. Пробел в начале и в конце имеют только два значения по факту. Проверьте так:
Берете строку "-word1 -word2 -word3 -word4 -word5". какое будет первое совпадение шаблона? - " -word2 ". После его нахождения оно изымается из строки. Получаем: "-word1-word3 -word4 -word5". И в итоге у нас в оставшейся строке остается только одно совпадение по шаблону: " -word4 ".
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Попробуйте так "\s?\-([a-z0-9]+)\s?"
 
Дмитрий(The_Prist) Щербаков Спасибо. Понял что изымается 1 совпадение. Но пока до конца не пойму. Сейчас некогда сидеть за компом. Вечером вернусь.
Изменено: Евгений Смирнов - 20.12.2021 11:02:35
 
Цитата
Евгений Смирнов написал:
Понял что изымается 1 совпадение
изымается каждое совпадение по очереди :) Не только первое. И при каждом таком изымании анализируется строка уже без изъятого значения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Код
(?:\s)\-([a-z0-9]+)(?=\s)
 
Оказывается чтобы понять, надо было сходить пообедать. Теперь понял. Ответ конечно у Дмитрий Щербакова.
Msi2102  RAN Вам тоже спасибо за отклик. Вечерком ваши паттерны изучу, а сейчас надо идти работать.
Тема закрыта
Изменено: Евгений Смирнов - 20.12.2021 12:15:39
 
Может проще использовать любой не пробельный символ. Или я не прав?
Код:
Код
Sub fdsg()
Dim re, Item, s As String
s = "-word1 -word2 -word3 -word4 -word5"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\S+"
re.Global = True
    For Each Item In re.Execute(s)
        Debug.Print Item.Value
    Next
End Sub
Изменено: artemkau88 - 20.12.2021 13:16:10
 
RAN Ваш паттерн дает 3 значения. Проверил сейчас. Буду разбираться
Страницы: 1
Наверх