- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经在 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
我已经在 Java 中检查了这个正则表达式,在这里它工作正常。我的语法是正确的,因为当我使用
.*
它工作正常。对于 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/
我已经在 shell 脚本中编写了这个用于匹配的简单脚本 file_name="xyz_abc_diagnostics.wifi2.2015-07-30.12-30-52.tar.gz" chk_re
我需要从网页的 HTML 代码中删除所有 Java Script 标签以及中间的内容和样式标签。到目前为止,我已经想出了这个表达式: "(]|>){1,}([ \r\n\t]|.)*?)|(]|>){
我是一名优秀的程序员,十分优秀!