正则表达式以匹配 Java 包名称



我想检查在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

您非常接近正确的解决方案。只需稍微调整正则表达式(也考虑@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是另一种更便携的解决方案。干杯。

您可以使用更简单的正则表达式,如下所示:

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

工作演示

根据 Java 包命名约定,基本语法

  • 仅允许使用小写英文字母、数字、_ 和 。
  • 必须从字母表开始
  • 不能格式不正确,例如:包含 .. | 结束与 . | 包含 Java 关键字

忽略关键字约束,正则表达式可以是

^[a-z][a-z0-9_]*(.[a-z0-9_]+)*[a-z0-9_]*$
//regex breakdown
//^[a-z]            start with one lowercase English alphabet
//[a-z0-9_]*        followed by zero or more of alphabets, numbers or _
//(.[a-z0-9_]+)*   zero or more of these
//                          .(one or more of alphabet|number|_)
//[a-z0-9_]*$       must end in alphabet|number|or _

尝试

这与@gvalkov的回答不同

  • 允许 word.word 构造的数量为零
  • 使用 * 增强最后一个字符检查以正确检测最后一个字符,即使存在 word.word 匹配

这可能是一个更好的方法

^[A-Za-z_][A-Za-z0-9_]*(?:.[A-Za-z_][A-Za-z0-9_]*)*$

相关内容

  • 没有找到相关文章

最新更新