Просмотров: 1701 | Дата: 18.04.2024 | Коментарии (0)

Color Regular Expression





Небольшая утилита применительно к PureBasic.
Строим и проверяем правильность работы регулярных выражений.
В поле текст - вставляем испытуемую строку текста.
В поле результат - вывод массива результатов поиска.
Двойной клик по списку спецификаций - добавить в в строку RegularExpression.
Подсветка результата работы.
Наличие пару примеров для понимания работы.
Таблица спецификаций и ссылки на статьи о Регулярных Выражениях.

Результат заносится в буфер обмена вида:



Скачать архив файлов 

; Последнее изменение: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












Сайт посвящён языку программирования PureBasic — коммерческий компилятор языка программирования, использующего синтаксис BASIC. Предназначен для создания кроссплатформенных приложений для AmigaOS, Linux, Microsoft Windows, Windows NT и Mac OS X. Разработан компанией Fantaisie Software.