Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с парсингом текстовой строки, Использую экземпляр RegExp'a 
:(
    Опции темы
mihanik
Дата 12.1.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Привет всем!!!
С Новым годом.

У мня проблемы с парсингом.
Имею стоку, в которой находися текст, похожий на содержимое ini-файла, а именно

Цитата

[start]
top=1
[stop]
left = 5
bottom=2


Хочу написать процедурку, которая определяла, есть ли секция ini-файла с нужным мне именем или нет и есть ли в этой секции ключ с нужным мне именем...

Для экспериментов создал маленькую процедурку...

Код

Private Sub Command4_Click()

Dim myRegExp As New RegExp          ' создаём экземпляр RegExp'a
Dim aMatch As Match                 ' один из совпавших образцов
Dim colMatches As MatchCollection   ' коллекция этих образцов

Dim S As String
Dim P As String
Dim section As String
Dim iniKey As String

    S = "[start]" & vbCrLf & _
        "top=1" & vbCrLf & _
        "[stop]" & vbCrLf & _
        "left = 5   " & vbCrLf & _
        "bottom=2"
    
    section = "start"
    iniKey = "top"
    
    P = "[.|\n]*\n*\s*\[\s*" & section & "\s*\]\s*\n*[.|\n]*\n*\s*" & iniKey & "\s*=\s*\w*\s*\n*[.|\n]*"
    
    ' Устанавливаем параметры myRegExp
    myRegExp.Global = True
    myRegExp.IgnoreCase = True
    myRegExp.MultiLine = True
    myRegExp.Pattern = P
    
    Set colMatches = myRegExp.Execute(S)
    
    For Each aMatch In colMatches ' проходим по всей коллекции
        MsgBox aMatch.FirstIndex & "," & aMatch.Length & "," & aMatch.Value
    Next aMatch
    
End Sub


Проблема заключается в том, что если устанавливаю

Код

    section = "start"
    iniKey = "top"


или

Код

    section = "stop"
    iniKey = "left "


То всё находится, а если 

Код

    section = "stop"
    iniKey = "bottom"


То ничего не находится.

Ля-ля-ля, жу-жу-жу,
Я сегодня торможу...





--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Naghual
Дата 12.1.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



По моему проще использовать стандартные методы для работы с ИНИ файлами.


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
mihanik
Дата 12.1.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



Это API-функции?
Пробовал.
Работает.
Хочу сам.

Мы (комсомольцы) хотим секса.
Но в гамаке и стоя!!!  smile

Добавлено @ 15:39 
Мне бы только Pattern  кто-нибудь помог бы подправить...


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
Black_Star
Дата 12.1.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 9.9.2003
Где: Minsk

Репутация: 4
Всего: 4



PM ICQ   Вверх
W4FhLF
Дата 12.1.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



(\[start\]\x0D\x0A)( *\w+ *\= *\d{1,6} *\x0D\x0A)*(top *\= *\d{1,6} *\x0D\x0A)

Добавлено @ 17:50 
На твоём примере проверял:
[start]
top=1
[stop]
left = 5
bottom=2



Это сообщение отредактировал(а) W4FhLF - 12.1.2007, 17:48


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mihanik
Дата 13.1.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



W4FhLF, 

Тогда уж переработав для моего примера получим

Код

P = "(\[" & section & "\]\x0D\x0A)( *\w+ *\= *\d{1,6} *\x0D\x0A)*(" & iniKey & "*\= *\d{1,6} *\x0D\x0A)"


Не работает...  smile 

Black_Star,  спасибо за ссылочку.
В MSDN всё примерно то же...
Но, всё равно спасибо.  smile 

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

Думаю....



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 13.1.2007, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



По-моему, у меня проблемы с прожорливостью регулярного выражения...


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 13.1.2007, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Цитата(mihanik @  13.1.2007,  10:48 Найти цитируемый пост)
У меня-то проблема в основном с тем, что если искомый ключ стоит сразу после названия секции, то он находится, а если между названием секции и самим ключём стоит ещё один или несколько ключей, то ничего не выдаётся... 


Ну как не работает? Ты же видишь я учёл этот момент: ( *\w+ *\= *\d{1,6} *\x0D\x0A)*
Это говорит препроцессору о том, что между твоей секцией и ключом могут находиться ещё несколько ключей. 

Беру вот такой пример:

Код

S = "[start]" & vbCrLf & _
        "top=1" & vbCrLf & _
        "[stop]" & vbCrLf & _
        "left = 5   " & vbCrLf & _
        "bottom=2"
    
    section = "start"
    iniKey = "top"
    
    myRegExp.Pattern = "(\[" & section & "\]\x0D\x0A)( *\w+ *\= *\d{1,6} *\x0D\x0A)*(" & iniKey & "*\= *\d{1,6} *\x0D\x0A)"
    
    Set colMatches = myRegExp.Execute(S)
    For Each aMatch In colMatches
        MsgBox aMatch.Value
    Next aMatch


Как результат на экране одно сообщение:

Цитата

---------------------------
Project1
---------------------------
[start]
top=1
---------------------------
ОК   
---------------------------


Теперь усложняю текст:

Код

    S = "[start]" & vbCrLf & _
        "somekey=1" & vbCrLf & _
        "top=1" & vbCrLf & _
        "[stop]" & vbCrLf & _
        "left = 5   " & vbCrLf & _
        "bottom=2"


Всё остальное оставляю так же. Как результат на экране вот такое сообщение:
Цитата

---------------------------
Project1
---------------------------
[start]
somekey=1
top=1
---------------------------
ОК   
---------------------------


Так, что это выражение учитывает все условия, который ввёл изначально. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mihanik
Дата 16.1.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



W4FhLF, спасибо за участие!!!  smile 

Вечером проверю твой вариант...
Посмотрю, что лучше работает.
Как только проверю, - отмечусь на форуме.

У меня тоже получилось написать регулярное выражение.
Вчера тестил... Вроде ничего...
Работает...
Я, правда, усложнил чуть-чуть условие.
Значение ключа стал брать в кавычки. т.е. примерно так...

Цитата

[start]
somekey="1"
top="1"


Ну... Это уже мои заморочки... smile


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
mihanik
Дата 16.1.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



W4FhLF!!!

Не обижайся, но твой паттерн не работает...

Работает такой

Код

myRegExp.Pattern  = "^\s*\[\s*" & Section & "\s*\]\s*$[^.$]*^\s*" & iniKey & "\s*=\s*"".*""\s*$"


Он требует небольшой доработки, но в принципе пока меня устраивает...
Вот, какая функция у меня получилась...

Код

' Метод "получить значение ключа"
Public Function GetKeyValue(ByVal iniSection As String, ByVal iniKey As String, Optional ByVal iniDefaultValue As String) As String
Dim myRegExp As New RegExp          ' создаём экземпляр RegExp'a
Dim aMatch As Match                 ' один из совпавших образцов
Dim colMatches As MatchCollection   ' коллекция этих образцов
Dim iniP As String
Dim S As String
Dim P1, P2 As Long
    
    Err = 0
    If IsMissing(iniDefaultValue) Then iniDefaultValue = ""
    
    iniP = "^\s*\[\s*" & iniSection & "\s*\]\s*$[^.$]*^\s*" & iniKey & "\s*=\s*"".*""\s*$"
    
    ' Устанавливаем параметры myRegExp
    myRegExp.Global = True
    myRegExp.IgnoreCase = True
    myRegExp.MultiLine = True
    myRegExp.Pattern = iniP

    Set colMatches = myRegExp.Execute(iniText)
    
    Select Case colMatches.Count
        Case 0:
                    GetKeyValue = iniDefaultValue
                    Err = 4
                    Exit Function
        Case 1:
                    S = colMatches.Item(0).Value
        Case Else:
                    S = colMatches.Item(0).Value
                    Err = 3
    End Select

    P2 = InStrRev(S, """")
    P1 = InStrRev(S, """", P2 - 1)
    S = Mid(S, P1 + 1, P2 - P1 - 1)
    
    GetKeyValue = S
    
End Function



--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
W4FhLF
Дата 17.1.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Цитата(mihanik @  16.1.2007,  21:44 Найти цитируемый пост)
Не обижайся, но твой паттерн не работает...


Да я не обижаюсьsmile Просто дело в том, что ты изначально не описал как следует шаблон, поэтому составить рабочее выражение, удовлетворяющее в полной мере твоим ребованиям, не удалось. А те требования, которые ты выдвинул вначале я учёл в своём выражении, твоё же финальное выражение описывает совсем иной шаблон, нежели начальные. Ну да ладно, разобрался сам, тем лучше.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
mihanik
Дата 17.1.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


-=Белый Медведь=-
****


Профиль
Группа: Комодератор
Сообщений: 4054
Регистрация: 24.4.2006
Где: г. Тверь

Репутация: 11
Всего: 109



W4FhLF, всё равно спасибо!!! 

 smile 

За "соучастие" получай в репу!!!


--------------------
Программистами не рождаются, - это родовая травма...
user posted imageuser posted image
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.