gpt4 book ai didi

java - 为什么我的正则表达式在 shell 脚本中失败,尽管它在 jregex 中工作?

转载 作者:行者123 更新时间:2023-11-29 09:39:59 25 4
gpt4 key购买 nike

我已经在 shell 脚本中编写了这个用于匹配的简单脚本

file_name="xyz_abc_diagnostics.wifi2.2015-07-30.12-30-52.tar.gz"
chk_regex=".*\.\d+\-\d+\-\d+\.\d+\-\d+\-\d+.*"
if [[ "$file_name" =~ $chk_regex ]];then
echo "in obs regex"
else
echo "dont triggered"
fi

我已经在 J​​ava 中检查了这个正则表达式,在这里它工作正常。我的语法是正确的,因为当我使用

.*

它工作正常。对于 shell 脚本正则表达式测试,我使用了这个站点 http://regexraptor.net/检查它也不匹配,但在 https://regex101.com/ 中它使用它匹配的 java 正则表达式。我无法理解为什么它在 shell 脚本中失败。shell 脚本正则表达式有什么区别吗?如果是,请建议我必须进行哪些更改

最佳答案

假设所有风格的正则表达式都相同是错误的。在这种情况下,bash 正则表达式不支持 \d。您应该将正则表达式更改为:

chk_regex='\.[0-9]+-[0-9]+-[0-9]+\.[0-9]+-[0-9]+-[0-9]+'

当然,这是假设当您说 \d 时,您只需要从 0 到 9 的数字,而不是在您的语言环境中被认为是数字的任何数字。如果你还想匹配这个范围之外的字符,那么 [[:digit:]] 可能就是你想要的,而不是 [0-9]

如果不需要参数扩展,通常使用'而不是"是个好习惯。

我还删除了前导和尾随 .*(因为它们没有做任何有用的事情)并取消转义 -(感谢 gniourf_gniourf 的评论) .

工作示例:

$ file_name="xyz_abc_diagnostics.wifi2.2015-07-30.12-30-52.tar.gz"
$ chk_regex='\.[0-9]+-[0-9]+-[0-9]+\.[0-9]+-[0-9]+-[0-9]+'
$ if [[ "$file_name" =~ $chk_regex ]];then
> echo "in obs regex"
> else
> echo "dont triggered"
> fi
in obs regex

如您所见,模式匹配,因此采用 if 分支。


如评论中所述,您也可以使用 globs 来匹配此模式:

[[ $file_name = *.+([[:digit:]])-+([[:digit:]])-+([[:digit:]]).+([[:digit:]])-+([[:digit:]])-+([‌​[:digit:]])* ]]

诚然,它的编写时间较长,但如果您想遍历与此模式匹配的文件,则 globs 可能很有用,例如:

for archive in *.+([[:digit:]])-+([[:digit:]])-+([[:digit:]]).+([[:digit:]])-+([[:digit:]])-+([‌​[:digit:]])*
do
# some stuff
done

请注意,在包含循环的示例中(以及旧版本 bash 的两个示例中),您需要使用 shopt -s extglob 启用扩展 glob。

关于java - 为什么我的正则表达式在 shell 脚本中失败,尽管它在 jregex 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32905127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com