develooper Front page | perl.perl6.users | Postings from October 2022

Re: regex: how to I pick out items in the middle?

Thread Previous | Thread Next
From:
William Michels via perl6-users
Date:
October 30, 2022 05:38
Subject:
Re: regex: how to I pick out items in the middle?
Message ID:
CAA99HCx6RjYf7hMC42Uvcty2HUSbFHL5ggpMpEB2WoiVhK+z4A@mail.gmail.com
On Sat, Oct 29, 2022 at 7:29 PM ToddAndMargo via perl6-users <
perl6-users@perl.org> wrote:

> >> On Sat, Oct 29, 2022 at 6:46 PM ToddAndMargo via perl6-users
> >> <perl6-users@perl.org <mailto:perl6-users@perl.org>> wrote:
> >>
> >>     Hi All,
> >>
> >>     With a regex, how do I pick out items in the middle of the string?
> Two
> >>     from the beginning or two from the end?
> >>
> >>
> >>     4] > my Str $y="xxxxxx"; $y ~~ s/ $([.*-2]) "x"/Q/; print $y ~ "\n"
> >>
> >>     ===SORRY!=== Error while compiling:
> >>     Malformed postfix call
> >>     ------> my Str $y="xxxxxx"; $y ~~ s/ $([.*⏏-2]) "x"/Q/; print $y ~
> "\n"
> >>
> >>
> >>
> >>     I am trying to do something like this:
> >>
> >>     [0] > my Str $x="1\n2\n3\n4\n5\n"
> >>     1
> >>     2
> >>     3
> >>     4
> >>     5
> >>
> >>     [1] > print $x.lines[*-2] ~ "\n"
> >>     4
>
> On 10/29/22 19:16, William Michels via perl6-users wrote:
> > In the Raku REPL:
> >
> > $ raku
> > Welcome to Rakudo™ v2022.07.
> > Implementing the Raku® Programming Language v6.d.
> > Built on MoarVM version 2022.07.
> >
> > To exit type 'exit' or '^D'
> > [0] > #beginning
> > Nil
> > [1] > my Str $y="xxxxxx"; S/^ x ** 2 /QQ/.say given $y;
> > QQxxxx
> > [1] > #inner
> > Nil
> > [2] > my Str $y="xxxxxx"; S/^ [x ** 2] <(x ** 2)> /QQ/.say given $y;
> > xxQQxx
> > [2] > #end
> > Nil
> > [3] > my Str $y="xxxxxx"; S/ x ** 2 $/QQ/.say given $y;
> > xxxxQQ
> >
> > HTH, Bill.
> >
>
> Yes it does!  Thank you!
>
> What does capitol S do?
>

Quote:

S/// uses the same semantics as the s/// operator, except it leaves the
original string intact and *returns the resultant string* instead of $/ ($/
still being set to the same values as with s///).

https://docs.raku.org/syntax/S$SOLIDUS$SOLIDUS$SOLIDUS

If you try to smartmatch with S///, you'll see the following error:

Potential difficulties:
    Smartmatch with S/// is not useful. You can use given instead: S///
given $foo

Hence the code above. If you like this approach, then I encourage you to
look at Raku's "ordinal" (i.e. positional) regex adverb(s): `:1st`, `:2nd`,
`:3rd`, etc. See:

https://docs.raku.org/language/regexes#Positional_adverbs

OTOH, if you **really** have elements separated by a fixed character (e.g.
"\n" or "\t"), you can `.split()` on that element, and use the positional
information to extract the (sub) elements you desire:

$ raku
Welcome to Rakudo™ v2022.07.
Implementing the Raku® Programming Language v6.d.
Built on MoarVM version 2022.07.

To exit type 'exit' or '^D'
[0] > my $tsv = "this\tis\ta\ttest";
this is a test
[1] > say $tsv.elems;
1
[1] > say $tsv.split("\t").raku;
("this", "is", "a", "test").Seq
[1] > say $tsv.split("\t").elems;
4
[1] > say $tsv.split("\t")[3];
test
[1] > say $tsv.split("\t").grep(/ t /, :p).raku;
(0 => "this", 3 => "test").Seq
[1] > say $tsv.split("\t").grep(/^ t /, :p).raku;
(0 => "this", 3 => "test").Seq
[1] > say $tsv.split("\t").grep(/ s /, :p).raku;
(0 => "this", 1 => "is", 3 => "test").Seq
[1] > say $tsv.split("\t").grep(/^ s /, :p).raku;
().Seq

Please note: for the `grep` examples above, `grep` isn't necessarily
returning the 1st, 2nd, or 3rd letter  "t" in the original string, since
each returned (matching) element could contain multiple "t" characters. So
you really have to decide what you want to target: the n-th "t" in a
string, or the n-th **tab-separated word** containing a "t" in the string.

HTH, Bill.

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About