Hi Todd (and JJ), On Fri, Jan 29, 2021 at 11:58 PM JJ Merelo <jjmer...@gmail.com> wrote: > > > > El sáb, 30 ene 2021 a las 7:24, ToddAndMargo via perl6-users > (<perl6-us...@perl.org>) escribió: >> >> Hi All, >> >> rakudo-pkg-2020.12-01.x86_64 >> >> Why does this work? >> >> > $x = "1.33.222.4"; >> 1.33.222.4 >> > $x ~~ m/ (<:N>+) [.] (<:N>+) [.] (<:N>+) [.] (<:N>+) /; >> 「1.33.222.4」 >> 0 => 「1」 >> 1 => 「33」 >> 2 => 「222」 >> 3 => 「4」 > > > This works because you have the right amount of capturing groups (<:N>+) > (https://docs.raku.org/language/regexes#capturing )separated by the right > amount of single characters (. matches a single character, check > https://docs.raku.org/language/regexes#Wildcards) It also works because <:N> > matches the unicode property number > (https://docs.raku.org/language/regexes#Unicode_properties), which includes > all kinds of numbers. If you are not going to use Balinese or Roman numerals, > it's probably OK if you use \d instead. Then, the string you're matching > (shown above) matches precisely the 4 groups there are. So ti works. You > probably want this instead: > > say "1.33.222.4" ~~ m/(\d+) "." (\d+) "." (\d+) "." (\d+) / > 「1.33.222.4」 > 0 => 「1」 > 1 => 「33」 > 2 => 「222」 > 3 => 「4」 > > Or, even better, > > say "1.33.222.4" ~~ m/(\d+) ** 4 % "." / > > Which uses the modified quantifier > (https://docs.raku.org/language/regexes#Modified_quantifier:_%,_%%) together > with a general quantifier > https://docs.raku.org/language/regexes#General_quantifier:_**_min..max saying > "I want this (\d+) exactly four times (** 4 ) separated by (%) a literal dot > "."". > >> >> >> >> But this does not? >> --> Why the wrong number in $2? >> --> Why no Nil for $3? >> >> > $x = "1.33.222"; >> 1.33.222 >> > $x ~~ m/ (<:N>+) [.] (<:N>+) [.] (<:N>+) [.] (<:N>+) /; > > > Because [.] is "a non-grouping class of characters that includes any > character". So <:N> is matching the first 2, then [.] is matching any > character, so matching and dropping > (https://docs.raku.org/language/regexes#Non-capturing_grouping) the second > one, and then the last group of <:N> is capturing the last one. It would fail > if you had had 2 digits, instead of three. > > This works and matches both strings. > > say $_ ~~ /(\d+) ** {3..4} % "\."/ for <1.33.222.4 1.33.222> > > 「1.33.222.4」 > 0 => 「1」 > 0 => 「33」 > 0 => 「222」 > 0 => 「4」 > 「1.33.222」 > 0 => 「1」 > 0 => 「33」 > 0 => 「222」 > > Once again, the regex tutorial is your friend > https://docs.raku.org/language/regexes, as well as the reference for Regex or > any of the other operators. > > Cheers > > -- > JJ
Following on from JJ's excellent example: > say "1.33.222.4" ~~ m/(\d+) ** 3..4 % "." / 「1.33.222.4」 0 => 「1」 0 => 「33」 0 => 「222」 0 => 「4」 > say "1.33.222" ~~ m/(\d+) ** 3..4 % "." / 「1.33.222」 0 => 「1」 0 => 「33」 0 => 「222」 > say "1.33" ~~ m/(\d+) ** 3..4 % "." / False > HTH, Bill.