Что нового

Регулярные выражения. Разрешить ввод только чисел и знаков +-

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем доброго времени суток
Помогите с регуляркой
Как разрешить ввод знаков + или - только первым символом, а после только числа?

Код:
$T1='+euyryuudgfg6+767'
$Data1 = StringRegExpReplace($T1, "[^0-9^+-]", "")
MsgBox(0,'',$Data1)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
что то типа
Код:
\A[\d+-]?\d*
но не заменять, а проверять ввод
Чтобы заменить надо делать 2 прохода
первый проход удалить всё кроме чисел и знаков. второй проход - удалить знаки не являющиеся началом строки
Код:
[^\d+-]
Код:
(?<!\A)[+-]


там можно же объединить
Код:
[^\d+-]|(?<!\A)[+-]
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
AZJIO, а можно принудительно заставить вводить знак + или -, чтобы обязательно сначала знак, а потом цифры
В варианте:
Код:
[^\d+-]|(?<!\A)[+-]

Можно ввести цифры без первого знака
 
A

Alofa

Гость
Код:
; Пример переработан и слизан отсюда: http://autoit-script.ru/index.php?topic=12322.0
; Почитайте эту тему

#Include <GUIConstants.au3>

GUICreate("MyGUI", 200, 50)
$Input = GUICtrlCreateInput("", 15, 15, 170)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFFF)
        Case $Input
            Switch BitShift($wParam, 16)
                Case $EN_CHANGE
                    Local $Data = GUICtrlRead($Input)
					If StringLen($Data) = 1 Then
						$Data = StringRegExpReplace($Data, '[^+-]', '')
					Else
						$Data = StringRegExpReplace($Data, '(.+)\D', '$1')
					EndIf
                    GUICtrlSetData($Input, $Data)
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
Alofa, я как раз брал примеры по вашей ссылке.
После ответа AZJIO, сделал решение, похожее на ваш пример.
Просто думал, что есть более изящное решение, например за один проход

Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 155, 150, 192, 114)
$Input1 = GUICtrlCreateInput("", 8, 24, 121, 21)
$Input2 = GUICtrlCreateInput("", 8, 64, 121, 21)
$Input3 = GUICtrlCreateInput("", 8, 96, 121, 21)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd


Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch BitAND($wParam, 0xFFFF)
        Case $Input1,$Input2,$Input3
            Switch BitShift($wParam, 16)
				Case $EN_CHANGE
					; Сначала должен быть указан знак + или -
                    If StringLeft(GUICtrlRead($Input1),1)<>'+' And StringLeft(GUICtrlRead($Input1),1)<>'-'  Then GUICtrlSetData($Input1, '')
					If StringLeft(GUICtrlRead($Input2),1)<>'+' And StringLeft(GUICtrlRead($Input2),1)<>'-'  Then GUICtrlSetData($Input2, '')
					If StringLeft(GUICtrlRead($Input3),1)<>'+' And StringLeft(GUICtrlRead($Input3),1)<>'-'  Then GUICtrlSetData($Input3, '')
                    GUICtrlSetData($Input1, StringRegExpReplace(GUICtrlRead($Input1), "[^\d+-]|(?<!\A)[+-]", ""))
					GUICtrlSetData($Input2, StringRegExpReplace(GUICtrlRead($Input2), "[^\d+-]|(?<!\A)[+-]", ""))
					GUICtrlSetData($Input3, StringRegExpReplace(GUICtrlRead($Input3), "[^\d+-]|(?<!\A)[+-]", ""))
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc
 
A

Alofa

Гость
pvnn сказал(а):
... думал, что есть более изящное решение...
Оно всегда есть, всегда, но не всегда на ползу ;)

Код:
#include <GUIConstants.au3>

GUICreate("MyGUI", 200, 50)
$Input = GUICtrlCreateInput("", 15, 15, 170)
GUIRegisterMsg($WM_COMMAND, "_WM_COMMAND")
GUISetState()

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	If BitAND($wParam, 0xFFFF) = $Input And BitShift($wParam, 16) = $EN_CHANGE Then GUICtrlSetData($Input, StringRegExpReplace(GUICtrlRead($Input), '(?(?<=[\d-+])(\D)|[^+-])', ''))
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND

;~ ; Это абсолютно такая же функция:

;~ Func _WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
;~ 	Switch BitAND($wParam, 0xFFFF)
;~ 		Case $Input
;~ 			Switch BitShift($wParam, 16)
;~ 				Case $EN_CHANGE
;~ 					Local $Data = GUICtrlRead($Input)
;~ 					$Data = StringRegExpReplace($Data, '(?(?<=[\d-+])(\D)|[^+-])', '')
;~ 					GUICtrlSetData($Input, $Data)
;~ 			EndSwitch
;~ 	EndSwitch
;~ 	Return $GUI_RUNDEFMSG
;~ EndFunc   ;==>_WM_COMMAND
 
Верх