Regex 要遵循特定模式的正则表达式
我正在尝试确保shell脚本的输入遵循格式名称\u Major\u Minor.extension 其中,Name是任何数字/字符数/“-”后跟“\ux” Major是后跟“\”的任意位数 小号是后跟“.”的任意位数 扩展名是文件名结尾后的任意数量的字符 我相当肯定我的正则表达式只是有点混乱。我当前运行的任何文件的计算结果都是“是”,但如果我添加“[A-Z]$”而不是“*$”,它的计算结果总是“否”。正如你可能知道的那样,正则表达式把我弄糊涂了Regex 要遵循特定模式的正则表达式,regex,bash,shell,grep,Regex,Bash,Shell,Grep,我正在尝试确保shell脚本的输入遵循格式名称\u Major\u Minor.extension 其中,Name是任何数字/字符数/“-”后跟“\ux” Major是后跟“\”的任意位数 小号是后跟“.”的任意位数 扩展名是文件名结尾后的任意数量的字符 我相当肯定我的正则表达式只是有点混乱。我当前运行的任何文件的计算结果都是“是”,但如果我添加“[A-Z]$”而不是“*$”,它的计算结果总是“否”。正如你可能知道的那样,正则表达式把我弄糊涂了 if echo $1 | egrep -q [A-
if echo $1 | egrep -q [A-Z0-9-]+_[0-9]+_[0-9]+\.*$
then
echo "yes"
else
echo "nope"
exit
fi
编辑:意识到我缺少“小调”的模式。但添加后仍不起作用。请改为尝试此正则表达式:
匹配[A-Za-z0-9-]+
名称
匹配[0-9]+
,后跟一个或多个数字
将组匹配两次:(?:…){2}
\u Major\u Minor
匹配后跟一个或多个字符的句点\..+
\.*
,它与句点\.
匹配任意次数。另外,[A-Z0-9-]
将只匹配大写字母,可能不是您想要的。使用=~运算符
Bash通过its支持正则表达式匹配,在这种特殊情况下,不需要使用egrep
:
if [[ "$1" =~ ^[A-Za-z0-9-]+_[0-9]+_[0-9]+\..*$ ]]
正则表达式中的错误
正则表达式中的\.*$
序列表示“零或多个点”。您的意思可能是“一个点和它后面的一些字符”,即,\..*$
正则表达式只匹配字符串的结尾($
)。您可能希望匹配整个字符串。要匹配整个字符串,请使用^
定位点匹配行的开头
转义命令行参数
如果仍要使用egrep
,则应转义其参数,就像转义任何命令行参数一样,以避免重新解释特殊字符,或者更确切地说,将参数用单引号或双引号括起来,例如:
if echo "$1" | egrep -q '^[A-Za-z0-9-]+_[0-9]+_[0-9]+\..*$'
使用printf而不是echo
,因为其行为被认为是不可靠的。改用printf
:
printf '%s\n' "$1"
/version_buddy.sh:第4行:`如果echo$1 | egrep-q^[A-Za-z0-9-]+(?:[0-9]+){2}\\+$'我得到了这个错误,我想我已经解决了。我添加了你的“a-z”(我不知道它区分大小写)。最后我在$前面加了一个*。我的正则表达式可能因为
(?:…)
而不起作用,它似乎不受支持,你可以试试^[a-Za-z0-9-]+([0-9]+){2}\\\+$。
。别忘了投票并接受!;)使用POSIX字符类[:alnum://code>代替硬编码A-Za-z0-9
。是的,grep需要-P
参数来支持lookarounds和其他PCRE构造,但在这种情况下它是不必要的。最后的+$
没有做任何有用的事情-有或没有它都会发生相同的匹配。实际上[:alnum:::
也匹配下划线。而+$
末尾匹配扩展名,这是必需的。