3

如何验证字符串是否也以一个或多个空格开头和结尾?

if [[ $username =~ [^0-9A-Za-z]+ ]]

(基本上输入应该是字母数字,任何地方都没有空格,即使在开头或结尾,也没有逗号、下划线、连字符等)

不幸的是,上面的正则表达式不匹配前导空格和尾随空格,但它匹配中间的空格?

如果没有 awk,sed,有什么方法可以修复上述正则表达式以匹配前导和尾随空格?

提前致谢

4

4 回答 4

4

引用 Bash 正则表达式可能会很棘手:不得引用正则表达式元字符,但是,由于空格在 shell 中很重要,因此必须引用空格。此正则表达式匹配以空格开头和结尾的字符串:

[[ $s =~ ^" ".*" "$ ]] && echo y

要测试字符串是否包含空格,请执行以下操作之一:

[[ $s =~ [[:space:]] ]] && echo y
[[ $s == *" "* ]] && echo y
于 2012-10-04T22:15:21.763 回答
1

这应该有效:

if [[ $username =~ "^ [^0-9A-Za-z]+ $" ]]
于 2012-10-04T19:30:04.787 回答
1

(基本上输入应该是字母数字,任何地方都没有空格,即使在开头或结尾,也没有逗号、下划线、连字符等)

呃,除非我错过了什么……

if ! [[ $username =~ ^[0-9a-zA-Z]+$ ]]
于 2012-10-04T19:34:02.967 回答
0

谢谢@Glennif [[ $username =~ [^0-9A-Za-z]+ ]]这是我原来的正则表达式,我希望用户只输入字母数字(不应接受所有其他字符,包括空格、下划线等)。我在无限while循环中使用读取并仅在有效输入时终止。

正则表达式匹配所有非字母数字,甚至与预期之间有空格的字符串,但它不匹配带有前导和尾随空格的条目(我认为是这样)。

然后我意识到它不是正则表达式,而是自动修剪前导和尾随空格的“读取”命令,所以当涉及到正则表达式时,变量本身已被修剪。

“解决这个问题的诀窍是重新定义您的 IFS(内部字段分隔符)变量。默认情况下,IFS 设置为空格、制表符和换行符来分隔读取命令的单词。” 从这个博客得到这个

http://fahdshariff.blogspot.in/2008/06/read-file-without-trimming-leading.html,我已经相应地修复了我的脚本。

感谢您跟进并解释详细信息!

于 2012-10-05T18:05:37.667 回答