I'm looking to write a regular expression to match the following paths.
puts/push/1234/request
puts/push/57689/request
puts/push/123/request
puts/push/4567/request
puts/push/34/request
Have a variable name Targetpath and any of the above path could be it's value. I have the following conditional expression to perform the match.
if [[ $Targetpath =~ puts/push/*/request ]]; then echo 1; else echo 0; fi
But the match is not happening and getting 0 echod to the terminal always
How the above command should be modified to perform the correct match.
CodePudding user response:
Try using the following regex string, modify the number of numerals if needed
regex="puts\/push\/[0-9]{2,}\/request"
if [[ $var =~ $regex ]]; then echo 1; else echo 0; fi
CodePudding user response:
If you plan to match any text but / in place of your * you can use
if [[ $Targetpath =~ puts/push/[^/] /request ]];
Note that [^/] is a negated bracket expression that matches one or more (since in POSIX ERE is a one or more quantifier) chars other than a / char.
Or, if you intend to match digits where your * is:
if [[ $Targetpath =~ puts/push/[0-9] /request ]];
Here, [0-9] (or [[:digit:]] ) matches one or more digits.
Here is a quick demo:
#!/bin/bash
Targetpath='puts/push/1234/request'
rx='puts/push/[0-9] /request'
if [[ "$Targetpath" =~ $rx ]]; then echo 1; else echo 0; fi
# => 1
Note you do not need to escape slashes in this case as / are not regex delimiters here (in sed commands, you need to escape / if / is used as a regex delimiter char).
In case you do not care what char appear between puts/push/ and /request, simply use glob matching:
if [[ "$Targetpath" == puts/push/*/request ]]; then echo 1; else echo 0; fi
Note the == operator and * that matches any text. However, note that glob patterns match the whole text/string, so you might need * on both ends of it, too.
CodePudding user response:
As I commented this requirement doesn't need regex. It can be done entirely in glob (or extglob):
Case 1: If you want to validate starting and ending part only then use:
[[ $Targetpath == puts/push/*/request ]]
Case 2: If you want to validate starting and ending part and allowing only digits in the middle part:
# enable extended glob
shopt -s extglob
[[ $Targetpath == puts/push/ ([[:digit:]])/request ]]
Case 3: If you want to validate starting and ending part and allowing only 1 of any non-/ characters the middle part:
# enable extended glob
shopt -s extglob
[[ $Targetpath == puts/push/ ([!/])/request ]]
