首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的RegEx在Bash中总是返回'true‘?

为什么我的RegEx在Bash中总是返回'true‘?
EN

Stack Overflow用户
提问于 2019-11-08 20:44:41
回答 1查看 93关注 0票数 1

作为bash脚本的一部分,我正在尝试构建一个过滤器,当传递不正确的文件名时,该过滤器将退出脚本:

代码语言:javascript
复制
if [[ ! $1 =~ [^DCS-932L20\d{14}(\.[jJ][pP][gG])$] ]]; then 
   echo "'$1' is not a valid name"
   exit 1
fi

在调试器中测试RegEx时,它匹配正确的字符串,例如:DCS-932L2019110607132405.jpg

但是,当在bash脚本中实现时,IF语句总是返回true

当我将RegEx缩短为[^DCS-]时,似乎一切都正常,但只添加'9‘([^DCS-9])就足以使语句始终返回true

我尝试转义([^DCS\-9][^DCS-\9])

我尝试了引号(["^DCS-9"]['^DCS-\9'])

我试着把它们组合起来。

对于bash和RegEx,我都是新手,所以如果有人能解释出哪里出了问题,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 20:57:57

您通过用方括号将正则表达式包装起来,从而在正则表达式之外创建了一个括号表达式。此外,Bash POSIX ERE正则表达式不支持\d速记字符类,您需要使用[0-9][[:digit:]]

最好在=~之前声明正则表达式,并将其用作不带引号的变量

代码语言:javascript
复制
rx='^DCS-932L20[0-9]{14}\.[jJ][pP][gG]$'
if [[ ! "$1" =~ $rx ]]; then

请参见online Bash demo

注意,这里不需要分组括号,因此它们被删除了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58766862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档