PDA

Показать полную графическую версию : [решено] В помощь по функциям StringRegExp и StringRegExpReplace


beve
18-02-2009, 23:59
В регулярных выражениях я пока новичок, и для изучения именно на применении их в Autoit-овских функциях StringRegExp и StringRegExpReplace я набросал для себя програмку где два окна(переключение между окнами идет по кнопке соответствующей): одно на функцию StringRegExp, второе - на функцию StringRegExpReplace. Поля ввода соответствуют описанию в справке Autoit:
StringRegExp ( "test", "pattern" [, flag ] [, offset ] ] )
StringRegExpReplace ( "test", "pattern", "replace", [ count ] )
Конечно ничего особенного, но может кому из новичков пригодится.
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>


;Создание окна для функции StringRegExpReplace
$hForm = GUICreate("StringRegExpReplace( Test, Pattern, Replace, [count])", 662, 521, 233, 157,$WS_SIZEBOX)
GUISetBkColor(0x00E0FFFF) ; will change background color
$Edit_test=GUICtrlCreateEdit("", 0, 69, 661, 205, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
$Edit_rezultat=GUICtrlCreateEdit("", 0, 297, 661, 113, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x800000)

$Ok_button=GUICtrlCreateButton("Произвести поиск ", 0, 464, 661, 27)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT)

$Button_pereklyuchenie = GUICtrlCreateButton("StringRegExp >>", 560, 48, 100, 20,0)
$Button_Clean = GUICtrlCreateButton("Очистить", 584, 275, 76, 20,0)

$Label1 = GUICtrlCreateLabel("Pattern (Искомый образец (шаблон) )", 0, 416, 240, 15)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)
$Label2 = GUICtrlCreateLabel("Результат поиска/замены", 2, 276, 148, 21)
GUICtrlSetFont(-1, 9, 400, 2, "Comic Sans MS")
GUICtrlSetColor(-1, 0x000080)
$Label3 = GUICtrlCreateLabel("Test (Исходный текст)", 1, 48, 357, 21)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)
$Label4 = GUICtrlCreateLabel("Replace (Текст замены)", 1, 1, 357, 21)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)
$Label5 = GUICtrlCreateLabel("Count", 624, 1, 521, 21)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)

$input_replase=GUICtrlCreateInput("\1", 0, 15, 621, 32)
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$input_count=GUICtrlCreateInput("0", 624, 15, 35, 32)
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$input_pattern=GUICtrlCreateInput("", 0, 432, 661, 32)
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)

;Создание окна для функции StringRegExp
$2hForm = GUICreate("StringRegExp (Test, Pattern, [flag],[ offset])", 662, 521, 233, 157,$WS_SIZEBOX)
GUISetBkColor(0x00E0FFFF) ; will change background color

$2Edit_test=GUICtrlCreateEdit("", 0, 69, 661, 205, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
$2Edit_rezultat=GUICtrlCreateEdit("", 0, 297, 661, 113, BitOR($ES_AUTOVSCROLL, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x800000)

$2Ok_button=GUICtrlCreateButton("Произвести поиск ", 0, 464, 661, 27)
GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
GUICtrlSetResizing(-1, $GUI_DOCKHEIGHT)

$2Button_pereklyuchenie = GUICtrlCreateButton("StringRegExpReplace >>", 535, 48, 125, 20,0)
$2Button_Clean = GUICtrlCreateButton("Очистить", 584, 275, 76, 20,0)

$2Label1 = GUICtrlCreateLabel("Pattern (Искомый образец (шаблон) )", 0, 416, 240, 15)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)
$2Label2 = GUICtrlCreateLabel("Результат поиска", 2, 276, 148, 21)
GUICtrlSetFont(-1, 9, 400, 2, "Comic Sans MS")
GUICtrlSetColor(-1, 0x000080)
$2Label3 = GUICtrlCreateLabel("Test (Исходный текст)", 1, 48, 357, 21)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)
$2Label4 = GUICtrlCreateLabel("Flag", 1, 1, 357, 21)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)
$2Label5 = GUICtrlCreateLabel("Offset", 624, 1, 521, 21)
GUICtrlSetFont(-1, 9, 400, 2)
GUICtrlSetColor(-1, 0x000080)

$2input_flag=GUICtrlCreateInput("3", 0, 15, 621, 32)
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$2input_offset=GUICtrlCreateInput("1", 624, 15, 35, 32)
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
$2input_pattern=GUICtrlCreateInput("", 0, 432, 661, 32)
GUICtrlSetFont(-1, 14, 0, 0, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
GUISetState(@SW_SHOW,$hForm)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Ok_button ;окно функции StringRegExpReplace
_onbuttonOk()
Case $2Ok_button ;окно функции StringRegExp
_onbuttonOk2()
Case $Button_Clean ;очистить поле ввода текста
GUICtrlSetData($Edit_test,"")
Case $2Button_Clean ;очистить поле ввода текста
GUICtrlSetData($2Edit_test,"")
Case $Button_pereklyuchenie
_Setokno() ;переключение на второе окно и соответственно к функци StringRegExp
Case $2Button_pereklyuchenie
_Setokno2() ;возвращение к первому окну и соответственно к функции StringRegExpReplace
EndSwitch
WEnd

;функция при нажатии на кнопку Произвести поиск в окне функции StringRegExpReplace
Func _onbuttonOk()
$get_count = GUICtrlRead($input_count)
$array_rezultat = StringRegExpReplace((GUICtrlRead($Edit_test)), (GUICtrlRead($input_pattern)),(GUICtrlRead($input_replase)), $get_count)
If @error = 0 Then
$get_count = @extended
EndIf
GUICtrlSetData($Edit_rezultat,$array_rezultat)
EndFunc

;функция при нажатии на кнопку Произвести поиск в окне функции StringRegExp
Func _onbuttonOk2()
$nOffset = GUICtrlRead($2input_offset)
$nflag=GUICtrlRead($2input_flag)
Switch $nflag
Case 0
$2array_rezultat = StringRegExp((GUICtrlRead($2Edit_test)), (GUICtrlRead($2input_pattern)),$nflag, $nOffset)
If @error = 0 Then
$nOffset = @extended
EndIf
if $2array_rezultat=1 then
GUICtrlSetData($2Edit_rezultat, "Есть совпадение")
else
GUICtrlSetData($2Edit_rezultat, "Совпадений нету")
endif
Case 1
Local $ar[100],$i=0
While 1
$2array_rezultat = StringRegExp((GUICtrlRead($2Edit_test)), (GUICtrlRead($2input_pattern)),$nflag, $nOffset)
If @error = 0 Then
$nOffset = @extended
Else
ExitLoop
EndIf
$ar[$i]=$2array_rezultat[0]
$i=$i+1
WEnd
$sAr_to_string=_ArrayToString($ar, @CRLF, 0, $i-1)
GUICtrlSetData($2Edit_rezultat, $sAr_to_string)
Case 3
$2array_rezultat = StringRegExp((GUICtrlRead($2Edit_test)), (GUICtrlRead($2input_pattern)),$nflag, $nOffset)
If @error = 0 Then
$nOffset = @extended
EndIf
$sAr_to_string=_ArrayToString($2array_rezultat, @CRLF, 0, UBound($2array_rezultat) - 1)
GUICtrlSetData($2Edit_rezultat,$sAr_to_string)
Case 4
Local $ar[100],$k=0
$2array_rezultat = StringRegExp((GUICtrlRead($2Edit_test)), (GUICtrlRead($2input_pattern)),$nflag, $nOffset)
If @error = 0 Then
$nOffset = @extended
EndIf
for $i = 0 to UBound($2array_rezultat) - 1
$match = $2array_rezultat[$i]
for $j = 0 to UBound($match) - 1
$ar[$k]=$match[$j]
$k=$k+1
Next
Next
$sAr_to_string=_ArrayToString($ar, @CRLF, 0, $k-1)
GUICtrlSetData($2Edit_rezultat,$sAr_to_string)
EndSwitch
EndFunc ;_onbuttonOk2()

;переключение на второе окно и соответственно к функци StringRegExp
Func _Setokno()
GUISetState(@SW_HIDE,$hForm)
GUISetState(@SW_SHOW,$2hForm)
;GUICtrlSetData($2Button_pereklyuchenie,"StringRegExpReplace >>")
EndFunc

;переключение на первое окно и соответственно к функци StringRegExpReplace
Func _Setokno2()
GUISetState(@SW_HIDE,$2hForm)
GUISetState(@SW_SHOW,$hForm)
EndFunc


Жалко Раскрашенный код поместить сюда не удалось, ибо немного длинный, ну что есть, то есть.

Добавлено:
Скрипт нужно запустить в SciTe или откомпилировать в exe файл и потом запустить...

semiono
19-02-2009, 10:51
Помгите, только не ругайтесь! Как вообще это работает, ибо я ничего не понимаю...

$x = RegRead("HKLM\Software\ax","")
$y = StringRegExpReplace($x,"{x}","")
RegWrite("HKLM\Software\ax","","REG_SZ",$y)
Exit

Почему ничего не происходит? Собсно я хочу для себя зделать примерчик, чтоб поизучать экспрессии наглядно.
Например, убрать из строки "1111-1111-111-11111-0" всё знаки "-", и заодно другие паттерны прощупать...
В примерах неужели нельзя без While итп. конструкций обойтись итак нифига не понятно!
Вот у мну пример простой, как и нужно, только что-то не работает. Может в $y флаги чтоль возвращает,
а как тогда со строкой работать? И в чём разница StringRegExpReplace vs StringRegExp - только первая чтоли
диструктивно работает?

ПС. Ничего себе примерчег для новичков, который тут надо мной - это уже целая утилита, но не пример! :)

А ну всё допилил! [resheno] :)
MsgBox(0, "", StringRegExpReplace("-987654321-2-3-4-5-6-7-8-9---", "[^0-9]", ""))

amel27
19-02-2009, 12:49
убрать из строки "1111-1111-111-11111-0" всё знаки "-" »
MsgBox(0, "", StringRegExpReplace("-987654321-2-3-4-5-6-7-8-9---", "-", ""))

И в чём разница StringRegExpReplace vs StringRegExp - только первая чтоли
диструктивно работает? »как и следует из названия StringRegExpReplace - заменяет, StringRegExp только "парсит", но интеллекта у последней побольше:
#include <array.au3>

$a = StringRegExp("-987654321-2-3-4-5-6-7-8-9---", "[0-9]+", 3)
_ArrayDisplay($a, "$a")

semiono
19-02-2009, 20:56
От того что парсит, толку мало для стратегических задач :)
Но наверно с логическими построениями может и быть толк реальный, наверно... не только информационый!




© OSzone.net 2001-2012