Я хочу проверить ввод пользователя в табличном списке с помощью выражения regex.
Обычно я хочу разрешить только цифры 0-9
:
$w configure -invalidcommand bell -validate key -validatecommand {regexp {^[0-9]*$} %S}
Оно работает нормально. Теперь я хочу расширить это выражение, чтобы разрешить только цифры 0-9 или точное слово "Rigid". Я попробовал это, но оно позволяет мне вводить что угодно.
$w configure -invalidcommand bell -validate key -validatecommand {regexp {regexp {^([0-9])|^Rigid?\>*$} %S}
Возможно, вам стоит поместить код проверки в процедуру:
$w configure -invalidcommand bell -validate key -validatecommand {validate %S}
proc validate {data} {
return [regexp {^(?:[0-9]*|Rigid)$} $data]
# or
return [expr {$data eq "Rigid" || [string is integer $data]}]
}
или
Шаблон ^([0-9])|^Rigid?\>*$
позволяет найти больше, чем нужно, поскольку ^
применяется только к ([0-9])
, цифре, поэтому первый символ должен быть цифрой, а остальные могут быть любыми. ^Rigid?\>*$
соответствует строке, которая начинается с Rigi
, может иметь d
после него, а затем содержит 0+ >
символов.
Вам нужно
{^(?:[0-9]*|Rigid)$}
Здесь якоря применяются к обоим шаблонам и допускают только 0+ цифр или Rigid
как целую строку.
$w configure -invalidcommand bell -validate key -validatecommand {regexp {^[0-9]*$} %S}
Это позволит использовать либо null, либо "одну или несколько цифр в диапазоне 0-9".
Чтобы обеспечить хотя бы 1 цифру, используйте + вместо *.
Теперь перейдем к вашему вопросу - разрешить цифры 0-9 или точное слово "Rigid"
Используйте {(^[0-9]+$|^Rigid$)}
Приведу пример, который я только что попробовал:
set a [gets stdin]
if {[regexp -- {(^[0-9]+$|^Rigid$)} $a]} { ставит "да" } else { ставит "нет" }
Выводы:
$ tclsh test1 12 да $ tclsh test1 Жесткий да $ tclsh test1 жесткий нет $ tclsh test1 32w нет $ tclsh test1
нет
$