【问题标题】:How to verify if the string also starts and ends with a space in shell script?如何验证字符串是否也在shell脚本中以空格开头和结尾?
【发布时间】:2012-10-04 19:00:22
【问题描述】:

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

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

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

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

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

提前致谢

【问题讨论】:

    标签: regex linux bash shell


    【解决方案1】:

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

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

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

    [[ $s =~ [[:space:]] ]] && echo y
    [[ $s == *" "* ]] && echo y
    

    【讨论】:

    • 嗨格伦,正则表达式也应该匹配前导和尾随空格。
    • "abc" 或 "abc" 也应该匹配。
    • if ! [[ $username =~ ^[0-9a-zA-Z]+$ ]] 匹配所有非字母数字输入,输入字符串的前导和尾随空格除外。例如“abc”或“abc”
    • @Sandeep,实际上,它匹配除单个字母数字字符之外的任何内容(由于您使用了锚点)。将匹配没有空格的“AB”。您能否准确地向我们说明您所做的和不想成为有效输入的内容?
    • 无法将整个文本放在这里,所以添加为答案,请参阅@glenn
    【解决方案2】:

    这应该可行:

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

    【讨论】:

    • 不确定是因为引号,正则表达式不匹配它之前所做的其他字符,如逗号、中间的空格等
    • 另外,我认为这只会匹配一个空格(开始和结束)而不是任何数字吗?
    【解决方案3】:

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

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

    if ! [[ $username =~ ^[0-9a-zA-Z]+$ ]]
    

    【讨论】:

    • 这是匹配一个或多个空格,但如果我给“abc”或“abc”它会错过这些,但你有点击中!谢谢,我现在有了线索,否定是关键:)
    • 它匹配前导和尾随空格,但如果该空格后面/前面有字符,则会错过它们。
    • “!”的意义是什么在这里,为什么像“abc”和“abc”这样的字符串不匹配?
    • ! 否定命令的返回码,用于 ||&&if。 "abc" 和 "abc" 不匹配,因为它们包含“[space] 任何地方”。
    • 正则表达式匹配“abc def”,因此它在两者之间匹配空格。如果空格在开头或结尾,它会丢失,而不是任何地方都存在空格!这有点奇怪。
    【解决方案4】:

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

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

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

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

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

    感谢您的跟进和详细说明!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多