【发布时间】:2012-10-04 19:00:22
【问题描述】:
如何验证字符串是否也以一个或多个空格开头和结尾?
if [[ $username =~ [^0-9A-Za-z]+ ]]
(基本上输入应该是字母数字,任何地方都不能有空格,即使是开头或结尾,也不能有逗号、下划线、连字符等)
不幸的是,上面的正则表达式不匹配前导和尾随空格,但它匹配中间的空格?
如果没有 awk、sed,我有什么办法可以修复上述正则表达式以匹配前导和尾随空格?
提前致谢
【问题讨论】:
如何验证字符串是否也以一个或多个空格开头和结尾?
if [[ $username =~ [^0-9A-Za-z]+ ]]
(基本上输入应该是字母数字,任何地方都不能有空格,即使是开头或结尾,也不能有逗号、下划线、连字符等)
不幸的是,上面的正则表达式不匹配前导和尾随空格,但它匹配中间的空格?
如果没有 awk、sed,我有什么办法可以修复上述正则表达式以匹配前导和尾随空格?
提前致谢
【问题讨论】:
引用 Bash 正则表达式可能会很棘手:不能引用正则表达式元字符,但是,由于空格在 shell 中很重要,因此必须引用空格。此正则表达式匹配以空格开头和结尾的字符串:
[[ $s =~ ^" ".*" "$ ]] && echo y
要测试字符串是否包含空格,请执行以下操作之一:
[[ $s =~ [[:space:]] ]] && echo y
[[ $s == *" "* ]] && echo y
【讨论】:
if ! [[ $username =~ ^[0-9a-zA-Z]+$ ]] 匹配所有非字母数字输入,输入字符串的前导和尾随空格除外。例如“abc”或“abc”
这应该可行:
if [[ $username =~ "^ [^0-9A-Za-z]+ $" ]]
【讨论】:
(基本上输入应该是字母数字,任何地方都不能有空格,即使是开头或结尾,也不能有逗号、下划线、连字符等)
呃,除非我错过了什么……
if ! [[ $username =~ ^[0-9a-zA-Z]+$ ]]
【讨论】:
! 否定命令的返回码,用于 ||、&& 和 if。 "abc" 和 "abc" 不匹配,因为它们包含“[space] 任何地方”。
感谢@Glenn if [[ $username =~ [^0-9A-Za-z]+ ]] 这是我原来的正则表达式,我希望用户只输入字母数字(不应接受所有其他字符,包括空格、下划线等)。我在无限 while 循环中使用读取,并且仅在有效输入时终止。
正则表达式匹配所有非字母数字,甚至与预期之间带有空格的字符串,但它不匹配带有前导和尾随空格的条目(我认为是这样)。
然后我意识到它不是正则表达式,而是自动修剪前导和尾随空格的“读取”命令,因此当涉及正则表达式时,变量本身已被修剪。
“解决这个问题的技巧是重新定义您的 IFS(内部字段分隔符)变量。默认情况下,IFS 设置为空格、制表符和换行符来分隔读取命令的单词。” 从这个博客得到这个
http://fahdshariff.blogspot.in/2008/06/read-file-without-trimming-leading.html,我已经相应地修复了我的脚本。
感谢您的跟进和详细说明!
【讨论】: