Что нового

[Данные, строки] Поиск+замена с использованием wildcards/шаблона (* + ?)

inx

Знающий
Сообщения
43
Репутация
12
Потребовалось сделать такой поиск с заменой, но не нашел на форуме ничего похожего.

Если я правильно понимаю делается примерно так:

Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 178, 330, 251, 188)
$Where = GUICtrlCreateInput("АБ1234567890", 16, 32, 145, 21)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label_Input_Find = GUICtrlCreateLabel("Где", 16, 8, 22, 17)
$Input_Find = GUICtrlCreateInput("АБ??", 16, 88, 145, 21)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label2 = GUICtrlCreateLabel("Что", 16, 64, 23, 17)
$Result = GUICtrlCreateInput("", 16, 288, 145, 21)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label_Result = GUICtrlCreateLabel("Результат", 16, 264, 56, 17)
$Button1 = GUICtrlCreateButton("Научный тык", 16, 200, 145, 33)
$Input_Replace = GUICtrlCreateInput("пустота", 16, 144, 145, 21)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$Label_Input_Replace = GUICtrlCreateLabel("Чем", 16, 120, 26, 17)
GUISetState(@SW_SHOW)

Global $Data

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$Data = GUICtrlRead($Where)
			SearchReplace()
			GUICtrlSetData($Result, $Data)
	EndSwitch
WEnd

Func SearchReplace()
	Local $SearchStr = GUICtrlRead($Input_Find)
	Local $ReplaceStr = GUICtrlRead($Input_Replace)
	If $SearchStr = "" Then
		Return
	Else
		$SearchStrRegExp = StringReplace($SearchStr, "?", ".")
		$SearchStrRegExp = StringReplace($SearchStrRegExp, "*", ".+")
		$Data = StringRegExpReplace($Data, $SearchStrRegExp, $ReplaceStr)
	EndIf
EndFunc   ;==>SearchReplace


Если можно как-то более элегантно, подскажите :smile:
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
Если * означает 0 и более символов, то можно так:
Код:
Func SearchReplace()
    Local $SearchStr = GUICtrlRead($Input_Find)
    Local $ReplaceStr = GUICtrlRead($Input_Replace)
    If $SearchStr = "" Then
        Return
    Else
        $SearchStrRegExp = StringRegExpReplace($SearchStr, '\?|(\*)', '.\1')
        $Data = StringRegExpReplace($Data, $SearchStrRegExp, $ReplaceStr)
    EndIf
EndFunc   ;==>SearchReplace



Добавлено:
Сообщение автоматически объединено:

Код:
Func SearchReplace()
        $Data = StringRegExpReplace($Data, StringRegExpReplace(GUICtrlRead($Input_Find), '\?|(\*)', '.\1'), GUICtrlRead($Input_Replace))
EndFunc   ;==>SearchReplace

Так элегантно?
 
Верх