Issue
I want to check if arguments passed in stdin to see if they conform to a valid java package name. The regex I have is not working properly. With the following code passing in com.example.package I receive the error message. I’m not sure what is wrong with my regex?
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
Solution
You are pretty close to the correct solution. Just tweak the regex a bit (also consider @fede’s simpler regex) and set the nocasematch
option for case insensitive matching. For example:
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
You are probably being misled by other languages that use /regex/i
(javascript) or qr/regex/i
(perl) for defining a case-insensitive regex object.
Btw, Using grep -qi
is another, more portable, solution. Cheers.
Answered By – gvalkov
Answer Checked By – Cary Denson (BugsFixing Admin)