正则表达式匹配java包名

时间:2015-04-21 21:05:02

标签: regex bash

我想检查是否在stdin中传递参数以查看它们是否符合有效的java包名称。我的正则表达式工作不正常。使用以下代码传入com.example.package,我收到错误消息。我不确定我的正则表达式有什么问题?

 regex="/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$/i"
 17         if ! [[ $1 =~ $regex ]]; then
 18                 >&2 echo "ERROR: invalid package name arg 1: $1"
 19                 exit 2
 20         fi

2 个答案:

答案 0 :(得分:4)

您可以使用更简单的正则表达式:

(?:^\w+|\w+\.\w+)+$

<强> Working demo

答案 1 :(得分:4)

您非常接近正确的解决方案。只需稍微调整正则表达式(也考虑@ fede的简单正则表达式)并设置nocasematch选项以进行不区分大小写的匹配。例如:

regex='^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+[0-9a-z_]$'

shopt -s nocasematch
if ! [[ $1 =~ $regex ]]; then
  exit 2
fi
shopt -u nocasematch

您可能被其他使用/regex/i(javascript)或qr/regex/i(perl)的语言误导,以定义不区分大小写的正则表达式对象。

顺便说一句,使用grep -qi是另一种更便携的解决方案。干杯。