我想将输入字符串(包含在变量 $1
中)与表示日期格式 MM/DD/YYYY
和 MM-DD 的正则表达式匹配-YYYY
.
REGEX_DATE="^\d{2}[\/\-]\d{2}[\/\-]\d{4}$"
echo "$1" | grep -q $REGEX_DATE
echo $?
无论输入字符串如何,echo $?
都会返回错误代码 1
。
最佳答案
补充现有的有用答案:
使用 Bash 自己的正则表达式匹配运算符,=~
,在这种情况下是一个更快的替代方案,因为您只匹配已存储在变量中的单个值:
set -- '12-34-5678' # set $1 to sample value
kREGEX_DATE='^[0-9]{2}[-/][0-9]{2}[-/][0-9]{4}$' # note use of [0-9] to avoid \d
[[ $1 =~ $kREGEX_DATE ]]
echo $? # 0 with the sample value, i.e., a successful match
但是请注意,注意使用特定 flavor 的正则表达式结构,例如 \d
同样适用:
同时 =~
支持 ERE(扩展 正则表达式),它还支持主机平台的特定扩展 - Bash 的行为与平台相关的情况很少见。
为了保持可移植性(在 Bash 的上下文中),坚持使用 POSIX ERE规范。
请注意 =~
甚至允许您定义捕获组(带括号的子表达式),稍后您可以通过 Bash 的特殊 ${BASH_REMATCH[@]}
访问其匹配项数组变量。
补充说明:
$kREGEX_DATE
使用未加引号,这是识别正则表达式所必需的(带引号的部分将被视为文字)。虽然并非总是必要,但建议首先将正则表达式存储在一个变量中,因为 Bash 在处理包含
\
的正则表达式 文字 时遇到麻烦。 .- 例如,在 Linux 上,其中
\<
支持匹配单词边界,[[ 3 =~ \<3 ]] && echo yes
不起作用,但是re='\<3'; [[ 3 =~ $re ]] && echo yes
- 例如,在 Linux 上,其中
我已经更改了变量名
REGEX_DATE
至kREGEX_DATE
(k
表示一个(概念上的)常量),以确保该名称不是全大写的名称,因为 all-uppercase variable names should be avoided to prevent conflicts with special environment and shell variables .
关于regex - 如何在 shell 脚本中使用正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35919103/