Поиск по маске с заменой ::

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Поиск по маске с заменой ::

Сообщение f0rbeed » 28.06.2003 (Сб) 5:37

Необходимо следующее: искать в выбранных файлах подстроку, к примеру
Код: Выделить всё
<TD class="text"><B>###</B></TD>
              <TD class=text>###</TD>
далее в ней брать подстроку <TD class=text>###</TD>, и выделять оттуда цифры, менять их, и снова записывать. Причем поиск, сразу видно, должен осуществляться по маске.(где решетка, то есть любой текст). Я понимаю что, многого хочу, но быть может, есть некий компонент...
Заранее спасибо... =0
Так быстро, что незаметно...

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

Сообщение GSerg » 28.06.2003 (Сб) 7:45

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

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 28.06.2003 (Сб) 10:44

Скорее в сторону regular expressions.

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 28.06.2003 (Сб) 14:33

Что значит регулярные выражения? По подробнее пожалуйста..
Так быстро, что незаметно...

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 30.06.2003 (Пн) 9:41

Это довольно пространная тема :) Поищи в MSDN, там подробно расписано - и синтаксис, и примеры и как в VB реализовать.

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 30.06.2003 (Пн) 19:50

Что-то я примеров не нашел, зато нашел кучу всяких expressions'ов. Я скачал Vbsript 5.6 а что дальше делать не знаю, может кто какой-нибудь нормальный пример даст поиска с заменой? Я нашел только пример с вводом e-mail.
Так быстро, что незаметно...

Urvin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 518
Зарегистрирован: 04.06.2003 (Ср) 10:47
Откуда: с Марса

Сообщение Urvin » 30.06.2003 (Пн) 20:19

1. Ищешь совпадение <TD class="text"> через InStr
2. Циклом доходишь до числовых значений, заносишь в переменную.
3. Делаешь с ней что хочешь.
4. Пишешь обратно
Не так страшен русский танк, как его пьяный экипаж

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 30.06.2003 (Пн) 20:29

Компонент называется Stinga Regular Expression Library

Код: Выделить всё
Option Explicit

Public Function test(html)
   
    Dim re As Object
    Dim pos As Long
   
    Set re = CreateObject("sgRegExp.RegExp")
    re.Expression = "<TD class=text>([0-9]+)</TD>"
    re.IgnoreCase = True
   
    pos = 1
    Do While (re.Match(html, pos))
       
        Debug.Print re.Substrings(1)
       
        With re.Substrings(0)
            pos = pos + .Start + .Length - 1
        End With
       
    Loop
   
    Set re = Nothing
   
End Function

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 30.06.2003 (Пн) 20:44

Да дело в том что таких "<TD class=text>([0-9]+)</TD>" много, а мне именно надо тот который стоит перед <TD class="text"><B>([a-z]+)</B></TD>. Просто мне конечно не все понятно из предыдущего кода то.
Так быстро, что незаметно...

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 01.07.2003 (Вт) 13:10

Ты просил название компонента и пример работы с ним. Я что должен знать полностью твоё задание? Замени строку маски и вперёд! К компоненту имеется вполне читабельный хелп.

f0rbeed
Обычный пользователь
Обычный пользователь
 
Сообщения: 68
Зарегистрирован: 18.12.2002 (Ср) 17:51
Откуда: Russia

Сообщение f0rbeed » 02.07.2003 (Ср) 12:03

Вообщем я нашел этот компонент. Вот у меня возник вопрос, что в этом куске твориться:
Код: Выделить всё
    Do While (re.Match(html, pos))
       
        Debug.Print re.Substrings(1)
       
        With re.Substrings(0)
            pos = pos + .Start + .Length - 1
        End With
       
    Loop


А вот кусок из которого мне надо вытащить цифры, поменять их, и запихнуть обратно:
Код: Выделить всё
<TR bgColor=#ffffff>
          <TD class="headcell"><B>Система обратного осмоса А-445</B></TD>
           <TD class=text>244</TD>
</TR>
<TR bgColor=#ffffff>
            <TD class="headcell"><B>Система обратного осмоса А-560</B></TD>
             <TD class=text>287</TD>
</TR>
                                         

Так какой же экспрешон должен быть для вот этого выражения? Я пока не особо разобрался с синтаксисом, и что запихивается в substrings после match, и что это дает вообще. Я сделал такой экспрешон:
Код: Выделить всё
re.Expression = "( +)<TD class=(.)headcell(.)><B>(.+)</B></TD>(\n +)<TD class=text>([0-9]+)</TD>"

По идее мои цифры это пятый элемент, но только я не правильно подобрал маску. Как ее следует оформить для моего случая, с учетом того что <TD class=text>287</TD> должен быть только тот который лежит перед TD class="headcell"><B>Система обратного осмоса А-560</B></TD>. И еще как потом эти
числа поменять и записать? За ранее спасибо. :oops:
P.S. И вот еще: если использовать поиск с помощью <TR bgColor=#ffffff>, далее пропускать строку, и использовать следующую то как записать этот expression?
Так быстро, что незаметно...

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 02.07.2003 (Ср) 13:20

Уже столько понаписано, а до сих пор не понятно что нужно сделать.
Какие цифры поменять надо? Только 244 или 287 тоже? Ты программу запускал? Она должна найти все вхождения ячеек таблицы которые сожержат только цифры. Если искомая ячейка находится первой, то и нечего огород городить. Делаем замену и выходим из цикла. В этом случае даже цикл не нужен.

f0rbeed писал(а):Вот у меня возник вопрос, что в этом куске твориться:
Код: Выделить всё
    Do While (re.Match(html, pos)) 'ищем подстроку по заданной маске с позиции pos
       
        Debug.Print re.Substrings(1) 'чего-то делаем с найденным
       
        With re.Substrings(0)
            pos = pos + .Start + .Length - 1 'передвигаем позицию
        End With
       
    Loop




f0rbeed писал(а):И еще как потом эти числа поменять и записать?

Если длина того на что заменяешь равна длине исходной подстроки, то
Код: Выделить всё
Mid(html, pos + .Start - 1, .Length) = "666"

, если не равна, то посложнее
Код: Выделить всё
html = Left$(html, pos + .Start - 1) & "666" & Mid$(html, pos + .Start - 1 + .Length)


Попробуй просто запустить код и посмотри что получается. Если чего не ясно - ставь точки останова и смотри что в объекте re.
Код: Выделить всё
Option Explicit

Public Function test()
   
    Dim iFF%, html$
   
    iFF = FreeFile()
    Open "c:\1\re.txt" For Input As #iFF
    html = Input(LOF(iFF), iFF)
    Close #iFF
   
    html = search(html)
   
    iFF = FreeFile()
    Open "c:\1\re1.txt" For Output As #iFF
    Print #iFF, html;
    Close #iFF
   
End Function

Public Function search(html) As String
   
    Dim re As sgRegExp.RegExp 'Object
    Dim pos As Long
   
    Set re = New sgRegExp.RegExp 'CreateObject("sgRegExp.RegExp")
    re.Expression = "<TD class=text>([0-9]+)</TD>"
    re.IgnoreCase = True
   
    pos = 1
    Do While (re.Match(html, pos))
       
        With re.Substrings(1)
            Debug.Print .Value
            Mid(html, pos + .Start - 1, .Length) = "666"
        End With
       
        With re.Substrings(0)
            pos = pos + .Start + .Length - 1
        End With
       
    Loop
   
    Set re = Nothing
   
    search = html
   
End Function


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 19

    TopList