我的任务是在java和shell脚本中编写一个正则表达式,它将验证只包含一个数字的所有字符串以及该数字前面或后面的任意数量的字符。
我写了[a-z]*[0-9]{1}[a-z]*
并且它适用于 Java ,但它根本不适用于 Shell脚本
任何人都可以帮我创建一个常规的表达式,以满足我在 Shell脚本
修改 (来自评论):
我试过grep
,但它没有给我有用的结果。 [...]如果字符串有效,我想执行某些操作。所以我用它就像
if [$password eq [a-z]*[0-9]{1}[a-z]]; then
# "do this"
else
# "do that"
fi
您能否对与正则表达式相关的Java和shell脚本中的语法差异有所了解?
答案 0 :(得分:1)
您没有指定哪个工具应评估shell环境中的正则表达式。但是大多数工具都无法识别{1}
部分。无论如何,这部分都不是必需的,因为单独[0-9]
也只能出现一次。
shell脚本部分如下所示:
if [[ "$var" =~ ^[a-zA-Z]*[0-9][a-zA-Z]*$ ]]; then
echo matching
else
echo not matching
fi
关键部分是:
[[
表达式,而不是[
表达式,因为前者支持模式匹配(通过==
)和正则表达式匹配(通过=~
)=~
与大多数正则表达式库一样,如果模式与字符串的任何部分匹配,则返回true
,不一定是完整的字符串。例如,[a-z]*[0-9][a-z]*
将与foo123bar456bla
匹配,因为该模式与3bar
部分匹配,“第一个[a-z]
出现零,[0-9]
一个出现,三次出现[a-z]
第二个^
“。因此,有必要使用$
和String var = ...;
if( var.matches("[a-zA-Z]*[0-9][a-zA-Z]*") )
System.out.println("matches");
将正则表达式固定到字符串的开头和结尾。在Java中:
String.matches
这里{{1}}隐式匹配完整的字符串。这一切都有点被历史所困扰。