/code/ Регулярные выражения. REGEXP и REGREPL

Раздел посвящен программированию с использованием Power Basic.
Dark Machine
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 126
Зарегистрирован: 26.05.2004 (Ср) 13:12

/code/ Регулярные выражения. REGEXP и REGREPL

Сообщение Dark Machine » 06.01.2007 (Сб) 22:05

Думаю будет уместным начать тему про REGEXP-ы.
Постим варианты разбора строк сюда.
Код: Выделить всё
'============================================
' Сжатие пробелов в строке
'============================================
'
CompressSpaces:
   TheMain = "Регулярные выр-ния,   как помощник  програмиста  !"
   Mask    = "\x20[\x20]+"   ' найти пробелы следующие друг за другом
   ReplaceMask = "\x20"      ' заменить одиночными
   PosVar = 1 :  StartVar = 1
   PRINT "TheMain начинается как: " & $DQ & TheMain & $DQ
   WHILE StartVar
      REGREPL Mask IN TheMain WITH ReplaceMask AT StartVar TO Posvar, NewMain
      StartVar = PosVar
      TheMain = NewMain
   WEND
   PRINT "TheMain Заменён на: "  & $DQ & NewMain & $DQ


Код: Выделить всё
'============================================
' Форматируем телефонные номера
'============================================
'
PhoneNumberFormat:
Mask = "\([0-9][0-9][0-9]\)-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]"
TheMain = " Позвони мне по номеру (123)-123-4567"
REGEXPR Mask IN TheMain TO PosVar,LenVar
IF PosVar THEN PRINT MID$(TheMain, PosVar, LenVar)


Код: Выделить всё
'============================================
' Поиск слов в строке
'============================================
'
TheMain = "Looking for words  in string" & $CRLF & " and   showing them  !"
mask = "[a-z]+\b"        ' \b = недокументированная CRLF word bound
PosVar = 1:   StartVar = 1
WHILE PosVar
  REGEXPR Mask IN TheMain AT StartVar TO PosVar,Lenvar
  IF PosVar THEN
     TheWord = MID$(TheMain, Posvar, LenVar)
     MSGBOX TheWord
     StartVar = PosVar + LenVar
  END IF
WEND

volo
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 142
Зарегистрирован: 10.12.2004 (Пт) 11:18
Откуда: Soviet Union

Сообщение volo » 09.01.2007 (Вт) 11:00

Добавлю короткую вырезку из примера организации поиска в базе
данных. Чем интересен такой поиск - это возможностью применения
всех особенностей REGEXPR

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

'  массив WS() - набор поисковых параметров (снятых с поисковой формы)
' FSEARCH -  запись из базы данных
' xi,yi - поисковые флаги

      IF WS(I,1 )<>"" THEN             ' поиск по фамилии
         REGEXPR WS(I,1)  IN FSEARCH.FAM  TO xi,yi
         IF xi=0 THEN ITERATE
      END IF
      IF WS(I,2 )<>"" THEN             ' поиск по имени
         REGEXPR WS(I,2)  IN FSEARCH.IM   TO xi,yi
         IF xi=0 THEN ITERATE
      END IF
      IF WS(I,3 )<>"" THEN             ' поиск по отчеству
         REGEXPR WS(I,3)  IN FSEARCH.OTC  TO xi,yi
         IF xi=0 THEN ITERATE
      END IF   

      перебор всех других параметров 
       ...
     
      IF xi=0 THEN ITERATE FOR     ' не найдено, продолжение поиска
      ' найдено, обработка 

SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение SLUTER » 20.03.2011 (Вс) 15:39

подниму тему.

имеется такой код.
Код: Выделить всё
FUNCTION PBMAIN () AS LONG
    LOCAL a$,b$,position&,length&
    b$ = "([A-Z]+)([0-9]+)"

    a$ = "A100500200500"

    REGEXPR b$ IN a$ TO position&, length&

    a$ = MID$(a$, position&, length&)
    MSGBOX a$
END FUNCTION 


мне нужно указать, что цифр должно быть, например, ровно 6. как это осуществить?
спасибо.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение iGrok » 20.03.2011 (Вс) 16:37

([0-9]{6})
http://ru.wikipedia.org/wiki/Регулярные_выражения
label:
cli
jmp label

SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение SLUTER » 20.03.2011 (Вс) 19:10

iGrok писал(а):([0-9]{6})
http://ru.wikipedia.org/wiki/Регулярные_выражения

гугл меня первой ссылкой в вики направил.
сам-то пробовал прежде чем постить? не работает такая конструкция.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение iGrok » 20.03.2011 (Вс) 22:36

Пробовал, не раз. Это стандартная конструкция.

Только, видимо, она не поддерживается в PB. Слава и почёт ему за это...

Ну тогда так: ([0-9][0-9][0-9][0-9][0-9][0-9])
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение Хакер » 21.03.2011 (Пн) 3:20

Может быть [0-9]{6,6} подхватит?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение iGrok » 21.03.2011 (Пн) 14:35

Хакер писал(а):Может быть [0-9]{6,6} подхватит?

Думаю, нет:
http://www.powerbasic.com/support/help/ ... tement.htm

Но попробовать можно.
label:
cli
jmp label

SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение SLUTER » 21.03.2011 (Пн) 16:51

Хакер писал(а):Может быть [0-9]{6,6} подхватит?

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

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение iGrok » 21.03.2011 (Пн) 17:31

SLUTER писал(а):
Хакер писал(а):Может быть [0-9]{6,6} подхватит?

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

Руки не у тебя, а у того, кто делал реализацию регулярок для PB. Впрочем, в справке честно написано, какие конструкции поддерживаются.

Я же написал и почему не работает, и какой вариант 100% будет работать.
Неужели он тоже не работает?
label:
cli
jmp label

SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение SLUTER » 21.03.2011 (Пн) 20:14

Неужели он тоже не работает?

на скорую руку протестил - ноль на фазу. может чё не доглядел или не допилил.
приведенный мною выше код иногда вообще выхватывает из текста что-то совсем левое, например символы, отличные от A-Z 0-9.

короче заюзал вот так. только интересно, как это скажется на производительности, если текст в strTemp будет обширным.
Код: Выделить всё
#COMPILE EXE
#DIM ALL

#INCLUDE "Win32API.inc"

FUNCTION PBMAIN () AS LONG
    LOCAL strTemp AS STRING
    LOCAL sResultStart AS LONG
    LOCAL strABC AS STRING
    LOCAL i AS LONG
   
    strABC = "ABCDEFGHIJKLMNOPQRSTUWVXYZ"
    strTemp = "dlkdsaj K123456 fdskf"

    FOR i = 1 TO 26
        sResultStart = 1
        1 sResultStart = INSTR(sResultStart, strTemp, MID$(strABC, i, 1))
        IF sResultStart > 0 THEN
            IF IsNumeric(MID$(strTemp, sResultStart+1, 6)) = -1 THEN
                MSGBOX MID$(strTemp, sResultStart, 7)
                EXIT FOR
            ELSE
                sResultStart=sResultStart+1
                GOTO 1
            END IF
        'else
        '    msgbox MID$(strABC, i, 1) + " - NOTHING"
        END IF
    NEXT i
END FUNCTION

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: /code/ Регулярные выражения. REGEXP и REGREPL

Сообщение iGrok » 22.03.2011 (Вт) 0:05

SLUTER писал(а):на скорую руку протестил - ноль на фазу. может чё не доглядел или не допилил.

Странно.

http://www.powerbasic.com/bin/regexpr.e ... B0-9%5D%29
label:
cli
jmp label


Вернуться в Power Basic

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

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

    TopList  
cron