Regex 要遵循特定模式的正则表达式

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-

我正在尝试确保shell脚本的输入遵循格式名称\u Major\u Minor.extension

其中,Name是任何数字/字符数/“-”后跟“\ux”

Major是后跟“\”的任意位数

小号是后跟“.”的任意位数

扩展名是文件名结尾后的任意数量的字符

我相当肯定我的正则表达式只是有点混乱。我当前运行的任何文件的计算结果都是“是”,但如果我添加“[A-Z]$”而不是“*$”,它的计算结果总是“否”。正如你可能知道的那样,正则表达式把我弄糊涂了

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:::
也匹配下划线。而
+$
末尾匹配扩展名,这是必需的。