我想检查在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_]*)*$