I'm trying to create regex for below data to parse, but not able to get second matched pattern 2.2.2.2 testIp2
. As don't have much exposure on regex, struggling since almost 12 hours.
Data to be parsed:
show names
names 1.1.1.1 testIp1 2.2.2.2 testIp2
name 192.168.1.1 testIp3
umesh 192.168.1.2 testIp4
The regex I could create:
^(?:name|names)(?:\s (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s (\S ))
Here is my perl code snippet:
while( $data =~ /^(?:name|names)(?:\s (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s (\S ))/mg) {
$LOGGER->debug("IPs : $1 : $2");
}
In the screenshot below, please check ip 2.2.2.2 testIP2 not being matched in regex101 tool:
CodePudding user response:
If there can be an arbitrary number of repetitions, it's probably better to extract the tokens and then loop over them using a very simple regex.
if($data =~ /^names?(?:\s (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s (\S ))/) {
my $match = $1;
while (s/$match/^(\d{1,3}(\.\d{1,3}){3})\s /) {
$LOGGER->debug("IPs : $1 : $2");
}
}
CodePudding user response:
Try following regex:
^(?:name|names)(?:\s (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s (\S ))(?:\s (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s (\S ))*