.
Строим и проверяем правильность работы регулярных выражений.
В поле текст - вставляем испытуемую строку текста.
В поле результат - вывод массива результатов поиска.
.
результата работы.
для понимания работы.
о Регулярных Выражениях.
; Последнее изменение:4 Апрель, 2011 @ 6:03:00 PM
Enumeration
#Window_0
#Frame:#Fram2:#Fram3:#Regular:#Font_0
#String:#Rezylt:#But:#Copy:#Open:#List
#Hyper:#Undo:#Redo:#study:#template
EndEnumeration
text.s="Искомое слово заключено например в 'одинарные кавычки' Средней строкой может 'быть' что угодно (.*?), \S - не пробел. Кавычки убираем в начале ?<=() и в конце ?=() строки. "
descr.s =GetTemporaryDirectory()+"Descr.txt"
template.s =GetTemporaryDirectory()+"template.txt"
If CreateFile(0,descr)
WriteData(0,?Im0, ?Im0End-?Im0)
CloseFile(0)
EndIf
If CreateFile(2,template)
WriteData(2,?Im1, ?Im1End-?Im1)
CloseFile(2)
EndIf
Global Dim Matched.s(100), Matching.i
Procedure IsMouseOver(wnd)
GetWindowRect_(wnd,re.RECT)
GetCursorPos_(pt.POINT)
ProcedureReturn PtInRect_(re,pt\x|(pt\y<<32))
EndProcedure
Procedure Color(Link$, EditorText$) ; выделяем слова для подсветки
#CFM_LINK = $20
#CFE_LINK = $20
SetGadgetText(#String, EditorText$)
For a=0 To Matching-1
Link$=Matched(a)
Repeat
Start = FindString(EditorText$, Link$,rez)
rez= Start + Len(Link$) ; изменяем позицию поиска
SendMessage_(GadgetID(#String), #EM_EXGETSEL, 0, chr.CHARRANGE)
SendMessage_(GadgetID(#String), #EM_HIDESELECTION, #True, 0)
SendMessage_(GadgetID(#String), #EM_SETSEL, Start-1, Start+Len(Link$)-1)
cf.CHARFORMAT2
cf\cbSize = SizeOf(CHARFORMAT2)
SendMessage_(GadgetID(#String), #EM_GETCHARFORMAT, #SCF_SELECTION, cf)
cf\cbSize = SizeOf(CHARFORMAT2)
cf\dwMask|#CFM_LINK
cf\dwEffects|#CFE_LINK
SendMessage_(GadgetID(#String), #EM_SETCHARFORMAT, #SCF_SELECTION, cf)
SendMessage_(GadgetID(#String), #EM_EXSETSEL, 0, chr)
SendMessage_(GadgetID(#String), #EM_HIDESELECTION, #False, 0)
Until rez= Len(Link$)
Next
EndProcedure
Procedure.s Between_2(string.s, L.s, R.s)
Position = FindString(string, L.s, 1)
string2.s = Right(string, Len(string)+1-Position-Len(L.s))
Position2 = FindString(string2, R.s, 1)
string3.s = Left(string2, Position2-1)
If Position <> 0
ProcedureReturn string3.s
EndIf
EndProcedure
Procedure Descr(descr.s,template.s) ; функция описания спецификаций
If ReadFile(0, descr.s)
While Eof(0) = 0
string.s=ReadString(0)
rez.s=Between_2(string.s, Chr(34),Chr(34))
rez2.s=Between_2(string.s,"~","~")
AddGadgetItem(#List,-1,rez+Chr(10)+rez2)
Wend
CloseFile(0)
EndIf
If ReadFile(0, template.s)
While Eof(0) = 0
string.s=ReadString(0)
rez.s=Between_2(string.s, Chr(34),Chr(34))
rez2.s=Between_2(string.s,"~","~")
AddGadgetItem(#template,-1,rez+Chr(10)+rez2)
Wend
CloseFile(0)
EndIf
EndProcedure
Procedure Regular(Find.s,String.s)
CreateRegularExpression(0,Find.s,#PB_RegularExpression_DotAll)
Matching.i = ExtractRegularExpression(0,String.s,Matched())
For i = 0 To (Matching - 1)
text.s=text.s+Matched(i)+#CRLF$
Next
FreeRegularExpression(0)
SetGadgetText(#Rezylt,text.s)
EndProcedure
Procedure Copy(Find.s)
S1.s="String.s="+Chr(34)+" "+Chr(34)+#CRLF$
S2.s="Find.s="+Chr(34)+Find.s+Chr(34)+#CRLF$+#CRLF$
S3.s="CreateRegularExpression(0,Find.s,#PB_RegularExpression_DotAll)"+#CRLF$
S4.s=" Dim Matched.s(100)"+#CRLF$
S5.s= "Matching.i = ExtractRegularExpression(0,String.s,Matched())"+#CRLF$
S6.s= "For i = 0 To (Matching - 1)"+#CRLF$
S7.s= "Debug Matched(i)"+#CRLF$
S8.s= "Next"+#CRLF$
S9.s="FreeRegularExpression(0)"+#CRLF$
SetClipboardText(S1+S2+S3+S4+S5+S6+S7+S8+S9)
MessageBeep(#MB_ICONASTERISK) ; вывод системного звука
EndProcedure
OpenWindow(#Window_0,0,0,800,420,"Проверка шаблона регулярных выражений",281673729)
EG=StringGadget(#Regular,7,12,620,24,"(?<=()')\S(.*?)(?=()')")
SetGadgetFont(#Regular, LoadFont(#Font_0, "Tahoma", 10, 16))
ButtonGadget(#Undo,650,13,130,22,"Отмена посл. дейст.")
EditorGadget(#String,7,50,787,130)
SetGadgetText(#String, text.s)
SendMessage_(GadgetID(#String),#EM_SETTARGETDEVICE, #Null, 0)
Frame3DGadget(#Fram3,7, 190, 367,30,"Результат работы")
StringGadget(#Rezylt,7,210,367,145,"",#ES_MULTILINE|#WS_VSCROLL|#ESB_DISABLE_LEFT|#ESB_DISABLE_RIGHT)
ButtonGadget(#But,10,390,90,20,"Проверить")
ButtonGadget(#Copy,125,390,120,20,"Скоп. код в буфер")
ButtonGadget(#Open,270,390,100,20,"Спецификации")
HyperLinkGadget(#Hyper,10,365,105,15,"Онлайновый сервер",RGB(248, 51, 7))
HyperLinkGadget(#study,150,365,95,15,"Статья о Reg.Expr.",RGB(248, 51, 7))
ListIconGadget(#List,-1385,190,410,220,"Символ",70)
AddGadgetColumn(#List, 1, "Описание", 1500)
ListIconGadget(#template,385,190,410,220,"Пример шаблона",150)
AddGadgetColumn(#template, 1, "Описание", 1500)
Descr(descr.s,template.s) ; функция описания спецификаций
;----создаеём меню для "Строка текста"
If CreatePopupMenu(1)
MenuItem(1,"Отменить")
MenuItem(2,"Повторить")
MenuBar()
MenuItem(3,"Вырезать")
MenuItem(4,"Копировать")
MenuItem(5,"Вставить")
MenuItem(6,"Удалить")
MenuBar()
MenuItem(7,"Выделить всё")
EndIf
;-------------------------------------
HideWindow(#Window_0, 0)
Repeat
Event = WaitWindowEvent()
;Window = EventWindow()
;Gadget = EventGadget()
;--------------------------------------------
If Event=#WM_RBUTTONUP ; вызов меню
If IsMouseOver(GadgetID(#String))
DisplayPopupMenu(1,WindowID(#Window_0))
EndIf
EndIf
;--------------------------------------------
Select Event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #But
MessageBeep(#MB_ICONASTERISK)
Find.s=GetGadgetText(#Regular)
String.s=GetGadgetText(#String)
Regular(Find.s,String.s)
Color(Link$,GetGadgetText(#String))
Case #Copy
Find.s=GetGadgetText(#Regular)
String.s=GetGadgetText(#String)
Copy(Find.s)
Case #Open
MessageBeep(#MB_ICONASTERISK)
open=open ! 1
If open
ResizeGadget(#List,385,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#template,-1385,#PB_Ignore,#PB_Ignore,#PB_Ignore)
SetGadgetText(#Open,"Шаблоны")
Else
ResizeGadget(#template,385,#PB_Ignore,#PB_Ignore,#PB_Ignore)
ResizeGadget(#List,-1385,#PB_Ignore,#PB_Ignore,#PB_Ignore)
SetGadgetText(#Open,"Спецификации")
EndIf
Case #List ;спецификации
If EventType()=#PB_EventType_LeftDoubleClick
Text.s = GetGadgetText(#List)
SendMessage_(EG,#EM_REPLACESEL,0,@Text)
EndIf
Case #Hyper
RunProgram("http://gskinner.com/RegExr/") ;онлайновый сервер с примерами шаблонов
Case #study
RunProgram("http://www.softring.ru/articles/perlregexp1.html") ;статья на русском
Case #Undo
SendMessage_(EG, #EM_UNDO, 0, 0)
Case #template
template.s= GetGadgetText(#template)
SetGadgetText(#Regular,template)
Teste1$=GetGadgetItemText(#template,GetGadgetState(#template) , 1)
SetGadgetText(#String,Teste1$)
EndSelect
;-------обработка меню---------------------
Case #PB_Event_Menu
Select EventMenu()
Case 1 ; "Отменить"
SendMessage_(GadgetID(#String), #EM_UNDO, #Null, #Null)
Case 2 ; "Повторить"
SendMessage_(GadgetID(#String), #EM_REDO, #Null, #Null)
Case 3, 4 ; "Вырезать", "Копировать"
SendMessage_(GadgetID(#String), #EM_GETSEL, @Min,@Max)
If Min<>Max
If Min