Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 | 2 |

 

  Вопрос: Поиск строк функцией REGEXPR Добавлено: 16.08.06 17:27  

Автор вопроса:  alex
Подскажите, как с помощью регулярных выражений найти подстроки ограниченные определенными символами. Например, у меня есть такой текст:

%texttest;2332.wew,%data;sdggfr!ggr%sssewe;weewf3

Мне нужной найти в нем строки начинающиеся с символа %и заканчивающиеся символом ; т.е.

%texttest;
%data;
%sssewe;

Не могу понять, как это реализовать с помощью реглярных выражений

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 16.08.06 18:12
%.+?;

Ответить

Номер ответа: 2
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #2 Добавлено: 16.08.06 23:38

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG
  LOCAL sMain,sField AS STRING
  LOCAL x,Rec AS LONG
  sMain="%texttest;2332.wew,%data;sdggfr!ggr%sssewe;weewf3"
'
  Rec=PARSECOUNT(sMain,"%";)    'считаем сколько полей в строке
  FOR x = 2 TO rec
    sField="%"+PARSE$(sMain,"%",x) ' Выделяем поле
    sField=LEFT$(sField, INSTR(-1, sField ,";";)) 'Обрезаем все что справа от ';'
    ? sField
  NEXT
'
END FUNCTION

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 17.08.06 05:25
Вроде бы просили регекспами...

Ответить

Номер ответа: 4
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #4 Добавлено: 17.08.06 06:57
Вроде бы просили регекспами...


REGEXPR:
Scan a string for a matching "wildcard" or regular expression.

сканирует сроку и выделяет то что надо по маске.
возвращает начало найденого и длину.]



задача же поставлена выделить все(если я не знаю что должно стоять между маркерами , каким тогда логическим способом определить что искать?) что стоит между двумя определенными символами, то есть парсинг что я и показал.

Ответить

Номер ответа: 5
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #5
Добавлено: 17.08.06 07:09
Я предложил регэксп. Пробуйте. В .NET по крайней мере работает отлично.

Ответить

Номер ответа: 6
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #6 Добавлено: 17.08.06 08:54
Можно и с regexpr

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG
  LOCAL sMain,sMask,c AS STRING
  LOCAL x,Rec,position,length,startPos,endPos AS LONG

  sMain="%texttest;2332.wew,%data;sdggfr!ggr%sssewe;weewf3"
  sMask="[%+?;]"
                   
  ;DO
      position& = position& + length&
      REGEXPR sMask IN sMain AT position& TO position&, length&
      startPos&=position&
      position& = position& + length&
      REGEXPR sMask IN sMain AT position& TO position&, length&
      endPos&=position&
      c$=MID$(sMain,startPos&,endPos&-startPos&;)
      IF c$<>"" THEN ? c$
  LOOP UNTIL c$="" OR position&=0

END FUNCTION


но в этом случае если в исходной строке
сбиваеться структура то вся логика гаснет, т.е. если например после первого % убрать ; то все рушиться,
при парсинге же первое поле просто игнорируеться и нормально считывает остальные поля. Можно конечно проверок еще накрутить чтоб не сбивалось, но непонятно зачем увеличивать код изощраясь с регекспом если задача - парсинг

P.S.
И громоздко как то , непрозрачно

Ответить

Номер ответа: 7
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #7
Добавлено: 17.08.06 09:06
регэкспы как раз для парсинга идеально подходят. Если вдруг структура исходных данных изменится, то переписывать ручной код парсинга будет довольно накладно. А в регэкспе всего лишь заменить регэксп. Да и отлаживать его проще.

Вот кстати, добавил чтобы оно такие вот "неверные" значения игнорировало и искало только верные:

%[^;%]+?;

Ответить

Номер ответа: 8
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #8 Добавлено: 17.08.06 10:09
Спасибо за ценные советы и исходники, они очень кстати! :)))))

Ответить

Номер ответа: 9
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #9 Добавлено: 17.08.06 17:43
в ПБ регулярные выражения не совсем совместимы
с питоном, ПХП..., и каждый раз возвращаясь к ним через некоторое время хочется назвать эти выражения не как
регулярные а как депрессивные выражения. Не знаю может не разобрался с ними до конца, поэтому использую их для выделения "чего-то" что можно описать, например найти все е-майлы в строке Mask$=";([a-z0-9._/+-]+)(@[a-z0-9.-]+)" . Но для выделения данных между делимитерами
ИМХО просче использовать PARSE, и менять рулы ИМХО тоже просче. Вот подправил первый пример:

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG
  LOCAL sMain,sField,startField,endField AS STRING
  LOCAL x,Rec AS LONG
  sMain="%texttest;2332.wew,%data;sdggfr!ggr%sssewe;weewf3"

  startField="%" : endField=";"           ' Parsing rules
  Rec=PARSECOUNT(sMain,startField)        '&#241;&#247;&#232;&#242;&#224;&#229;&#236; &#241;&#234;&#238;&#235;&#252;&#234;&#238; &#239;&#238;&#235;&#229;&#233; &#226; &#241;&#242;&#240;&#238;&#234;&#229;
  FOR x = 2 TO rec
    sField=startField+PARSE$(sMain,startField,x) '&#194;&#251;&#228;&#229;&#235;&#255;&#229;&#236; &#239;&#238;&#235;&#229; (&#194;&#241;&#229; &#247;&#242;&#238; &#236;&#229;&#230;&#228;&#243; startField="%";)
    sField=PARSE$(sField,endField,1)      '&#206;&#225;&#240;&#229;&#231;&#224;&#229;&#236; &#226;&#241;&#229; &#247;&#242;&#238; &#247;&#242;&#238; &#241;&#242;&#238;&#232;&#242; &#239;&#238;&#241;&#235;&#229; &#239;&#229;&#240;&#226;&#238;&#227;&#238; ';' = endField
    ? sField
  NEXT
  ? "Stop",64,"Report"
END FUNCTION


Ответить

Номер ответа: 10
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #10 Добавлено: 17.08.06 17:56
Блин, вот он результат парсинга наверху,
если русский символ стоит сразу после апострофа, то получили очень закодированные комментарии :D

Ок, тоже самое но надеюсь вставится нормально

#COMPILE EXE
#DIM ALL

FUNCTION PBMAIN () AS LONG
  LOCAL sMain,sField,startField,endField AS STRING
  LOCAL x,Rec AS LONG
  sMain="%texttest;2332.wew,%data;sdggfr!ggr%sssewe;weewf3"

  startField="%" : endField=";"    ' Parsing rules
  Rec=PARSECOUNT(sMain,startField) ' Считаем количество полей в исходной строке
  FOR x = 2 TO rec
    ' получаем одно поле (все что находится между "%"-signs = startField)
    sField=startField+PARSE$(sMain,startField,x)
    ' Обрезаем мусор после первого ";"-sign = endField
    sField=PARSE$(sField,endField,1)
    ? sField
  NEXT
  ? "Stop",64,"Report"
END FUNCTION

Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 17.08.06 20:45
Попробуй вот так. У меня работает во всяком случае для этой строки
#Compile Exe

#Include "WIN32API.INC"

Function PBMain
Dim sMain$, mask$
sMain$="%texttest;2332.wew,%data;sdggfr!ggr%sssewe;weewf3"
mask$="%([^;]*);"
Dim start&,iPos&,iLen&
start&=1
Do
 RegExpr mask$ In sMain$ At start& To iPos& , iLen&
 MsgBox Mid$(sMain$,iPos&,iLen&;)
 start&=iPos&+iLen&
Loop While iPos&>0
End Function

Ответить

Номер ответа: 12
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #12
Добавлено: 18.08.06 15:16
Вот кстати, добавил чтобы оно такие вот "неверные" значения игнорировало и искало только верные:
%[^;%]+?;

 Или ты чего-то перемудрил или в PB такое выражение не работает (а может вообще характерно только для .NET). Само по себе твоё выражение вообще ничего не находит, только если убрать знак вопроса, но тогда функция перестаёт находить последовательности, состоящие только из '%;'.


JMP,
sMask="[%+?;]"

 Судя по справке, ты пытаешся найти один любой из указанных в квадратных скобках символов: '%' или '+' или '?' или ';'.
[ ] (square brackets) Identifies a user-defined class of characters, any of which will match: [abc] will match a, b, or c. Only three special metacharacters are recognized within a class definition, the caret ^ for complemented characters, the hyphen - for a range of characters, or one of the following \ backslash escape sequences: \\ \- \] \e \f \n ...

Ответить

Номер ответа: 13
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #13
Добавлено: 18.08.06 16:39
? - это в моем выражении средство от "жадности"... Можно и без него.

Чтобы находило %; (хотя такой задачи вроде не стояло), то надо + заменить на * то есть так:

%[^;%]*;

Ответить

Номер ответа: 14
Автор ответа:
 alex



Вопросов: 84
Ответов: 453
 Профиль | | #14 Добавлено: 18.08.06 16:51
Кстати, а зачем нужен REGREPL ?

Ответить

Номер ответа: 15
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #15 Добавлено: 18.08.06 17:41

REGREPL mask$ IN sMain$ WITH repl$ [AT start&] TO iPos&, newmain$


Тоже самое что и REGEXPR, только после того как найдет
искомое заменяет это искомое на значение из newmain$

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам