Регулярные выражения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Регулярные выражения

Сообщение HaSH » 04.10.2006 (Ср) 16:00

Не совсем по ВБ, но все же...

Пишу регулярное выражение для вытаскивание некоторых однотипных выражений из строки. Проблемма в том, что кол-во елементов разное и в результате сохранается только последнее совпадание.
например
строка "1.23.324.54" нужно вытащить цифры разделеные точками. количество цифр и "разрядов" может быть разное.
выражение типа
([0-9]\.)* возвращает только последнюю цыфру, а хотелось бы все.
как победить?

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 04.10.2006 (Ср) 16:08

подумал немного - получается что нужно несколько раз проходить по строке, прально?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 04.10.2006 (Ср) 16:32

А не легче в данном случае использовать ф-ю Split, чем заморачиваться с рег. выражениями?
Salus populi suprema lex

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 04.10.2006 (Ср) 16:36

Нет, не легче.
строку с циферками я привел для примера. Рабочая строка намного сложне, сплитом ее не возмешь.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.10.2006 (Ср) 16:39

Так приведи рабочую строку, ибо приведенный пример действитель проще через Split обработать!
Весь мир матрица, а мы в нем потоки байтов!

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 04.10.2006 (Ср) 16:45

О. ПХУКЕТ + БАНГКОК (в Бангкоке 2 ночи в отеле D'MA Pavillion или Prince Palace или Eastin)

Нужно вытащить названия отелей (D'MA Pavillion, Prince Palace, Eastin) при том что:
1. кол-во может менятся
2. Разделитель тоже может меняться (вместо "или" - ",") или еще что то

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 04.10.2006 (Ср) 16:50

Обязательно ли название отелей состоит из латинских букв, а остальное предложение из русских?
Salus populi suprema lex

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 04.10.2006 (Ср) 16:54

dr.MIG писал(а):Обязательно ли название отелей состоит из латинских букв, а остальное предложение из русских?


Да
еще они могут содержать символы &,-,'
З.Ы. Еще может меняться О. ПХУКЕТ + БАНГКОКБангкоке 2 ночи в отеле
З.Ы.Ы. Не хочется привязыватся к определеной фразе т.к. могут быть пропущены некоторые буквы, пропущен или, наоборот, поставлен лишний пробел и тд...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 04.10.2006 (Ср) 17:17

похоже, что одними регулярными выражениями у тебя ничего не выйдет. придется свой парсер писать, имхо 8)

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 04.10.2006 (Ср) 17:27

Konst_One писал(а):похоже, что одними регулярными выражениями у тебя ничего не выйдет. придется свой парсер писать, имхо 8)


Выйдет. Я уже написал регулярное выражение. Проблема в том что - см первый пост

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 04.10.2006 (Ср) 17:48

Хотелось бы видеть код...
Короче, вот пример (копи пастом, но вроде работает)
Код: Выделить всё

Dim myRegExp As New RegExp ' создаём экземпляр RegExp'a
myRegExp.MultiLine = False ' текст однострочный
myRegExp.Global = True ' будем проходить всю строку
myRegExp.IgnoreCase = True ' игнорируем регистр символов
myRegExp.Pattern = "<BODY (.*)</BODY>" ' маска

Dim aMatch As Match ' один из совпавших образцов
Dim colMatches As MatchCollection ' коллекция этих образцов
Dim testString As String ' тестируемая строка

testString = "<HTML><BODY bgcolor=#FFAABB>" & _
"<P>Это пример</P></BODY></HTML>" ' текст для теста

Set colMatches = myRegExp.Execute(testString) ' запускаем!

For Each aMatch In colMatches ' проходим по всей коллекции
    List1.AddItem aMatch.FirstIndex
    List1.AddItem aMatch.Length
    List1.AddItem aMatch.SubMatches(0)
    List1.AddItem aMatch.Value
Next aMatch

Может поможет.
Salus populi suprema lex

HaSH
Новичок
Новичок
Аватара пользователя
 
Сообщения: 40
Зарегистрирован: 08.12.2005 (Чт) 12:24
Откуда: г. Киев

Сообщение HaSH » 04.10.2006 (Ср) 18:04

в итоге сделал так:
Код: Выделить всё

While regexp.Test(strTestString) = True
Set colMath = regexp.Execute(strTestString)
Set math = colMath.Item(0)
ReDim Preserve arrHotel(UBound(arrHotel) + 1)
arrHotel(UBound(arrHotel)) = Trim(math.SubMatches(0))
strTestString = Replace(strTestString,  math. SubMatches(0), "", 1, 1, vbTextCompare)
Wend

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.10.2006 (Ср) 21:11

Всё зависит от реализации регэкспа...
В дотнетовской реализации по умолчанию кванторы жадные, т.е. находят самое длинное из возможных совпадений. При желании можно добавить спецсимвол и сделать квантор ленивым.

Видимо, в используемой реализации кванторы наоборот по умолчанию ленивые, и тогда надо почитать документацию на предмет того, как сделать квантор жадным...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.ru [бот], Majestic-12 [Bot] и гости: 3

    TopList