如何编写一个验证字母数字和空格的正则表达式

时间:2015-07-31 01:58:14

标签: regex bash function shell

我正在编写一个清理用户输入的bash验证函数。

这个想法是,如果脚本有3个参数,那么这些参数可能只是字母数字值。但是参数可以是用双引号括起来的多个单词,如下所示:

myfunction arg1 arg2 "this is arg3"

所以我基本上想要剥离所有不是字母数字或空格字符的东西。

目前,我已经:

validateEntry() { string=$1 clean=${string//[^a-zA-Z0-9\s]/} }

但它似乎不起作用。在myfunction arg1 arg2 "this is arg3"中,is arg3被剥离了。

我使用此函数的方式是在脚本中,如下所示:

name=$(validateEntry $1)

我需要帮助。

编辑:

我们的想法是在脚本中使用validateEntry函数,可以使用3个参数,如下所示:

if [[ "$#" -eq 3 ]]; then
    arg1=$(validateEntry $1)
    arg2=$(validateEntry $2)
    arg3=$(validateEntry $3)
    echo "${arg1}, ${arg2}, ${arg3}."
fi

但如果我的脚本的第三个参数是this is arg3$arg3会减少到this,即使我直接使用相同的三个参数调用我的函数,第三个arg是this is arg3

2 个答案:

答案 0 :(得分:5)

\s并不意味着"任何类型的空白"在一个模式(这不是一个正则表达式)。相反,要么只使用文字空间

clean=${1//[^a-zA-Z0-9 ]}

或者,如果要匹配空格,制表符,换行符等,请使用POSIX字符类[:space:]

clean=${1//[^a-zA-Z0-9[:space:]]}

(就此而言,您也可以为字母和数字使用字符类:

clean=${1//[^[:alnum:][:space:]]}

一旦你完成了这项工作,你还需要改变另外两件事:

  1. 您需要实际输出已清理的值:

    validateEntry () {
       echo "${1//[^[a[:alnum:][:space:]]}"
    }
    
  2. 您需要引用要验证的扩展,以便将整个内容传递给您的函数:

    name=$(validateEntry "$1")
    

答案 1 :(得分:2)

编辑以匹配问题。

function validateEntry {
    echo ${1//[^[:alnum:][:space:]]/}
}


if [[ $# -eq 3 ]]; then
    echo $(validateEntry "$1")
    echo $(validateEntry "$2")
    echo $(validateEntry "$3")
fi

命令

./test.sh arg1 arg2 "this is arg3"

输出:

arg1
arg2
this is arg3