此问题已在此处有答案:
How do you escape a hyphen as character range in a POSIX regex(2个答案)
上个月关门了。
我正在尝试识别用户提供的文件名是否包含无效字符。我添加了这一部分:
filename=$(basename "$sourceFilePath")
if [[ ! $filename =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then
echo "Invalid characters in filename: $filename Please provide a valid filename."
exit 0
fi
不幸的是,当文件名有效时,它会进入查询。举例来说:
if [[ ! test.txt =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then echo "Invalid characters in filename: Please provide a valid filename."; fi
Invalid characters in filename: Please provide a valid filename.
if [[ ! "test.txt" =~ ^[a-zA-Z0-9_\-\.]+$ ]]; then echo "Invalid characters in filename: Please provide a valid filename."; fi
Invalid characters in filename: Please provide a valid filename.
我做错了什么?
谢谢
2条答案
按热度按时间vhmi4jdf1#
反斜杠在bash正则表达式中不以这种方式工作。点不需要,但破折号需要移动到组的开头或结尾。
还要注意,这个正则表达式接受像
.
或..
这样的名称,这可能会导致问题。gxwragnw2#
您没有指定“无效”的标准,但从您的尝试中,我假设您想要验证文件名仅由字母,数字,下划线字符,破折号和句号组成。
对于这样一个简单的测试,使用正则表达式是多余的。如果你颠倒测试的逻辑,你可以通过globbing来实现:
这里的技巧不仅是否定有效字符的范围,而且还将
-
放在有效字符列表的开始,这样它就不会被理解为字符范围指示符。根据您的需求,您也可以使用
a-zA-Z0-9
来代替字符类[:alnum:]
。