InStr ппц

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

strelec
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 28.02.2009 (Сб) 22:04

InStr ппц

Сообщение strelec » 20.12.2011 (Вт) 20:43

вот ниже написан 2 кода))) оба одно и тоже а почему 1 работает правильно а второй нет




Код: Выделить всё
Dim rr As String = "http://letitbit.net/download/98683.95c094797ffc1ab802df37faae1c/_Friends.With.Kids.2011.ENG.DVDScreener.avi.html"
       
If InStr(rr, "With.Kids.2011.ENG.DVDScreener.avi") Then
            If InStr(rr, "kommuna.me") = 0 Then
                If InStr(rr, ".html") Then 'And InStr(m.Groups(1).ToString, "folder") = 0
                    MsgBox("---")
                End If
            End If

        End If

Код: Выделить всё
Dim rr As String = "http://letitbit.net/download/98683.95c094797ffc1ab802df37faae1c/_Friends.With.Kids.2011.ENG.DVDScreener.avi.html"
       
If InStr(rr, "With.Kids.2011.ENG.DVDScreener.avi") And InStr(rr, "kommuna.me") = 0 And InStr(rr, ".html") Then
            MsgBox("---")
        End If

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2011 (Вт) 20:53

Код: Выделить всё
Module All

Sub Main()
  Dim rr As String = "http://letitbit.net/download/98683.95c094797ffc1ab802df37faae1c/_Friends.With.Kids.2011.ENG.DVDScreener.avi.html"

  If InStr(rr, "With.Kids.2011.ENG.DVDScreener.avi") Then
    If InStr(rr, "kommuna.me") = 0 Then
      If InStr(rr, ".html") Then 'And InStr(m.Groups(1).ToString, "folder") = 0
        MsgBox("1")
      End If
    End If
  End If

  If InStr(rr, "With.Kids.2011.ENG.DVDScreener.avi") And InStr(rr, "kommuna.me") = 0 And InStr(rr, ".html") Then
    MsgBox("2")
  End If

  If rr.Contains("With.Kids.2011.ENG.DVDScreener.avi") AndAlso Not rr.Contains("kommuna.me") AndAlso rr.Contains(".html") Then
    MsgBox("3")
  End If
End Sub

End Module

Получаю все 3 MsgBox'а. Что не так?

PS: Нежелательно использовать InStr и другие строковые функции VB6.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2011 (Вт) 21:00

Кстати And побитовый. Пиши <>0, а лучше AndAlso.

И стоит убедиться, что что-то не работает перед тем, как писать, что оно не работает. 74 And -1 And 104 = 72.
Последний раз редактировалось Qwertiy 20.12.2011 (Вт) 21:03, всего редактировалось 1 раз.

strelec
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 28.02.2009 (Сб) 22:04

Re: InStr ппц

Сообщение strelec » 20.12.2011 (Вт) 21:02

Qwertiy привет )
а вот я не получаю ((((
ну с куками разобрались был проблемма .нет )))) а тут в чем может быт проб лемма )))) просто код у меня большой и вот изатких как-бы правильных но не работающих коды приходится менять все код )))
Код: Выделить всё
If InStr(rr, "With.Kids.2011.ENG.DVDScreener.avi") And InStr(rr, "kommuna.me") = 0 And InStr(rr, ".html") Then
            MsgBox("---")
        End If

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 20.12.2011 (Вт) 21:04

Перечитай про побитовый And!

strelec
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 28.02.2009 (Сб) 22:04

Re: InStr ппц

Сообщение strelec » 20.12.2011 (Вт) 21:10

Код: Выделить всё
    If rr.Contains("With.Kids.2011.ENG.DVDScreener.avi") AndAlso Not rr.Contains("kommuna.me") AndAlso rr.Contains(".html") Then
            MsgBox("3")
        End If

работает)

strelec
Обычный пользователь
Обычный пользователь
 
Сообщения: 93
Зарегистрирован: 28.02.2009 (Сб) 22:04

Re:

Сообщение strelec » 21.12.2011 (Ср) 3:39

Qwertiy писал(а):Перечитай про побитовый And!

Qwertiy есть такой вапрос

возможно-ли с помощью regex.replaxe сделать следующее

мне надо удалит все теги который начинаются на <a .. и кончаются на </a> но если внутри этих тегов встретится img то его не трогать
пример
<a href....><input buton1...> text1</a>
<a href....><img " src="...> text2</a>

красным который отмечен должно удалится а зеленым нет
я думаю возможно через цикл и проверка
но просто хочется через регулярный выражения =)
Код: Выделить всё
test = Regex.Replace(test, "<a(.*?(?!img)).*?</a>", "")

мб исправишь мою ошибку? )

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 16:11

strelec писал(а):мб исправишь мою ошибку? )

Бррррррр...

Сделай так:
Код: Выделить всё
Imports System.Text.RegularExpressions

Module All
  Public Sub Main()
    Dim Str As String = "QQQ <a href....><input buton1...> text1</a> WWW <a href....><img src='...'>text2</a> EEE"
    MsgBox(Regex.Replace(Str, "<a.*?</a>", Function(M As Match) If(M.Value.Contains("<img"), M.Value, "")))
  End Sub
End Module

Кстати, воможно, что поиск в строке эффективнее усложнения выражения. Хотя для данного случая не утверждаю.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 16:36

strelec писал(а):мб исправишь мою ошибку? )

Исправил:
Код: Выделить всё
MsgBox(Regex.Replace(Str, "<a(.(?!<img))*?</a>", ""))

Дело в том, что за каждым пропущенным символом не должно следовать "<img", а в твоём варианте должна существовать хотя бы одна последовательность, за которой оно не следует.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 16:47

Qwertiy писал(а):Кстати, воможно, что поиск в строке эффективнее усложнения выражения. Хотя для данного случая не утверждаю.

Проверил:
Код: Выделить всё
Imports System.Text.RegularExpressions

Module All

Public Sub Main()
  Dim Str As String = "QQQ <a href....><input buton1...> text1</a> WWW <a href....><img src='...'>text2</a> EEE"
  Dim Res As String
  Dim Time As Date

  'MsgBox(Regex.Replace(Str, "<a(.(?!<img))*?</a>", ""))
  'MsgBox(Regex.Replace(Str, "<a.*?</a>", Function(M As Match) If(M.Value.Contains("<img"), M.Value, "")))

  Time = Now()
  For Q As Integer = 0 To 32767
    Res = Regex.Replace(Str, "<a(.(?!<img))*?</a>", "")
  Next Q
  MsgBox((Now() - Time).TotalMilliseconds)

  Time = Now()
  For Q As Integer = 0 To 32767
    Res = Regex.Replace(Str, "<a.*?</a>", Function(M As Match) If(M.Value.Contains("<img"), M.Value, ""))
  Next Q
  MsgBox((Now() - Time).TotalMilliseconds)

End Sub

End Module

Вариант с проходом по строке быстрее примерно в 2 раза: 999 мс и 453 мс.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 22.12.2011 (Чт) 11:34

Я тут подумал... А зачем вообще что-то удалять понадобилось? Не проще сразу искать нужные куски и с ними работать?


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList