in reply to This should be simple

Regexp::Common is useful for patterns like dotted decimal IPv4 addresses. The following gives you the leftmost such address. If you want to be sure to get the address between the parentheses, use literal parens as positive lookaround anchors.

Win8 Strawberry 5.30.3.1 (64) Wed 06/29/2022 21:31:05 C:\@Work\Perl\monks >perl use strict; use warnings; use Regexp::Common qw(net); my $ip = 'csteppfw pts/0 2022-06-27 15:53 (192.168.5.100)'; ($ip) = $ip =~ m{ (?<! \d) $RE{net}{IPv4} (?! \d) }xmsg; print "'$ip' \n"; ^Z '192.168.5.100'

Update: If for some reason you want to roll your own IPv4 regex ("I can't download modules!" — but see Yes, even you can use CPAN):

Win8 Strawberry 5.8.9.5 (32) Wed 06/29/2022 23:13:52 C:\@Work\Perl\monks >perl use strict; use warnings; # same as $RE{net}{IPv4} dotted decimal my $octet = qr{ 25 [0-5] | 2 [0-4] \d | [01]? \d \d? }xms; my $rx_ipv4 = qr{ (?> $octet (?: [.] $octet){3}) }xms; my $ip = 'csteppfw pts/0 2022-06-27 15:53 (192.168.5.100)'; ($ip) = $ip =~ m{ (?<! \d) $rx_ipv4 (?! \d) }xmsg; print "'$ip' \n"; ^Z '192.168.5.100'


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: This should be simple (updated)
by steppnav (Initiate) on Jun 30, 2022 at 12:46 UTC
    Good input all! Thanks. The comment about stuff not being anchored help me understand why the "throw away the last part of the line" part of the match didn't get the paren following the naive regex pattern (I don't care if it is a valid IP). I had put that '?' non-greedy flag on and with .* an empty string matched. All I had to do was anchor the end with '$'.

    That assignement into a list with a capturing /.../ match thing was very interesting. I'm using a goofy while loop to repeatedly capture and the rip off the IP from lines until there is no matching IP pattern, then move on to the next line (while (<>). That assignement using the match looks like I could use it with an array variable on the left and a 'g' on the match to capture all the matching IP's on a given line. I'll try that after coffee.

    Thanks again.

      ... using a ... while loop to repeatedly capture and the rip off the IP from lines until there is no matching IP pattern ... use it with an array variable on the left and a 'g' on the match to capture all the matching IP's on a given line.

      Exactly right.


      Give a man a fish:  <%-{-{-{-<