#!/usr/bin/perl use strict; # https://www.perlmonks.org/?node_id=11154990 use warnings; use feature 'bitwise'; use List::AllUtils qw( reduce ); my @floats = ( [ '0.', 'valid' ], [ '0.007', 'valid' ], [ '.757', 'valid' ], [ '125.89', 'valid' ], [ '+10789.24', 'valid' ], [ '+107894', 'valid' ], [ '-0.0008', 'valid' ], [ 'The temperature is 28.79C', 'valid' ], [ 'Frequency: 10877.45Hz', 'valid' ], [ '255.0.0.0', 'invalid' ], [ '255.aa', 'valid' ], [ "10.13.2023, today's date", 'invalid' ], [ '0.119.255.255' , 'invalid' ], [ 'Date: 10.13.2023 BC', 'invalid' ], [ '-42', 'valid' ], [ '2004.04.12 Friedl nomatch','invalid, Friedl pg 195' ], [ 'all of 12.34 and 3.4.5.6 and 37' ], [ '300 10.16.2023 -42 255.0.0.0 lucky 7' ], ); my $leftside = length reduce {$a |. $b->[0]} @floats; # auto-adjust for my $str ( map $_->[0], @floats ) { my @numbers = grep /./, $str =~ /(?| (?:(?:\d+\.){2,}\d+)() | ([+-]?(?:\d+(?:\.\d*)?|\.\d+)) )/gx; printf "%*s %s\n", $leftside, $str, "@numbers"; }