我正在构建一个代码以将用户输入添加到文件中,但是我想捕获一个事件,其中用户只输入了whitepstaces,而无需其他。我怎么做?目前,我正在硬编码"one_answers",如果用户输入一个或两个空格,它将抓住,但我相信有比我的更好的解决方案。
PROC将用户输入插入文本文件
proc inputWords {entryWidget} {
set inputs [$entryWidget get]
$entryWidget delete 0 end
if {$inputs == ""} {
.messageText configure -text "No empty strings"
} elseif {$inputs == " " || $inputs == " "} {
.messageText configure -text "No whitespace strings"
} else {
set sp [open textfile.txt a]
puts $sp $inputs
close $sp
.messageText configure -text "Added $inputs into text file."
}
}
GUI代码
button .messageText -text "Add words" -command "inputWords .ent"
entry .ent
pack .messageText .ent
接受任意长度的空格字符串,包括0:
string is space $inputs
接受没有空的空格字符串:
string is space -strict $inputs
结果为true(= 1)或false(= 0)。
文档:字符串
您可以使用{^ s $}之类的正则表达式,该表达式匹配字符串的开始,然后仅在字符串末尾匹配一个或多个whitespaces(空间或tab)。因此,在您的示例中:
elseif {[regexp {^s+$} $inputs]} {
.messageText configure -text "No whitespace strings"
...
如果要检查所有whitespace 和在同一表达式中的空字符串,请使用{^ s*$}。
有关TCL中的正则表达式的更多信息,请参见http://wiki.tcl.tk/396。如果这是您第一次接触正则表达式,我建议您在线寻找正则表达式教程。
假设,您想修剪出用户输入的领先和落后空间,您可以修剪字符串并检查零length。在性能方面,这更好:
% set inputs " "
% string length $inputs
4
% string length [string trim $inputs]
0
%
% time {string length [string trim $inputs]} 1000
2.315 microseconds per iteration
% time {regexp {^s+$} $inputs} 1000
3.173 microseconds per iteration
% time {string length [string trim $inputs]} 10000
1.8305 microseconds per iteration
% time {regexp {^s+$} $inputs} 10000
3.1686 microseconds per iteration
%
% # Trim it once and use it for calculating length
% set foo [string trim $inputs]
% time {string length $foo} 1000
1.596 microseconds per iteration
% time {string length $foo} 10000
1.4619 microseconds per iteration
%