Добрый день.
Есть форма, где пользователь должен ввести числа месяца или их диапазоны, разделенные запятыми (наподобии того, как указываются страницы при печати документов из различных программ). Т.е. что-то вроде "1, 5, 16-18, 0" ("0" подразумевает последний день месяца). Захотелось сделать проверку вводимого в Input текста "на лету". Посмотрев примеры на оф форуме, написал такой вот скрипт:
Но он проверяет лишь то, что вводимый символ входит в разрешенный набор, не проверяя их последовательность, в результате чего он пропустит такие строки как:
1256, 45, 000
-, 5, 16-18, 0
,,,,, 0
-,-,-,-,-,----
и т.п. Хотелось бы сделать проверку более интеллектуальной. Проблема в том, что с регулярными выражениями практически не знаком. Весь день читал различные мануалы, смотрел примеры, но так и не смог написать ничего работающего.
Сам алгоритм проверки видится таким:
Первый символ: [0-3]
После "0" могут идти: [,\s]
После "1" и "2" могут идти: [,\s\d-]
После "3" могут идти: [,\s01-]
После "\s" могут идти: [0-3,-]
После "," могут идти: [0-3\s]
После "-" могут идти: [1-3\s]
После двух подряд цифр могут идти: [,\s-]
Помогите, пожалуйста, перевести этот алгоритм в регулярное выражение. Или может быть посоветуете какие-то альтернативные способы реализовать такую проверку.
Есть форма, где пользователь должен ввести числа месяца или их диапазоны, разделенные запятыми (наподобии того, как указываются страницы при печати документов из различных программ). Т.е. что-то вроде "1, 5, 16-18, 0" ("0" подразумевает последний день месяца). Захотелось сделать проверку вводимого в Input текста "на лету". Посмотрев примеры на оф форуме, написал такой вот скрипт:
Код:
#include <GUIConstants.au3>
Global $iTimer = -1
Global $iTime_Expired = 1000
Global $sText, $sTextPrev
GUICreate("", 320 ,120)
$hInput = GUICtrlCreateInput( "", 10, 20, 300, 20)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
If $iTimer <> -1 And TimerDiff($iTimer) >= $iTime_Expired Then
$iTimer = -1
GUICtrlSetBkColor($hInput, 0xFFFFFF)
EndIf
$sText = GuiCtrlRead($hInput)
If $sTextPrev <> $sText Then
$iTimer = -1
GUICtrlSetBkColor($hInput, 0xFFFFFF)
EndIf
If StringRegExp($sText, '[^\d\s,-]') Then
GUICtrlSetData($hInput, StringRegExpReplace($sText, '[^\d\s,-]', ""))
$iTimer = TimerInit()
GUICtrlSetBkColor($hInput, 0xFFCACA)
Endif
$sTextPrev = GUICtrlRead($hInput)
Wend
Но он проверяет лишь то, что вводимый символ входит в разрешенный набор, не проверяя их последовательность, в результате чего он пропустит такие строки как:
1256, 45, 000
-, 5, 16-18, 0
,,,,, 0
-,-,-,-,-,----
и т.п. Хотелось бы сделать проверку более интеллектуальной. Проблема в том, что с регулярными выражениями практически не знаком. Весь день читал различные мануалы, смотрел примеры, но так и не смог написать ничего работающего.
Сам алгоритм проверки видится таким:
Первый символ: [0-3]
После "0" могут идти: [,\s]
После "1" и "2" могут идти: [,\s\d-]
После "3" могут идти: [,\s01-]
После "\s" могут идти: [0-3,-]
После "," могут идти: [0-3\s]
После "-" могут идти: [1-3\s]
После двух подряд цифр могут идти: [,\s-]
Помогите, пожалуйста, перевести этот алгоритм в регулярное выражение. Или может быть посоветуете какие-то альтернативные способы реализовать такую проверку.