Re: Need regex in the middle wildcard help

[email protected] (ToddAndMargo via perl6-users)
Newsgroups perl.perl6.users
Message-ID <[email protected]>
>> On 6/18/23 05:38, ToddAndMargo via perl6-users wrote:
>>> Hi All,
>>> 
>>> I know how to do this with several regex's and words.
>>> What I'd like to learn is how to remove something
>>> from the middle with regex using a wild card.
>>> 
>>> And I can't figure it out
>>> 
>>> 
>>> #!/bin/raku
>>> 
>>> print "\n";
>>> my Str $x = Q[wine-7.12-3.fc37.i686.rpm</a>    23-Jul-2022 19:11  11K <a 
>>> href="wine-7.12-3.fc37.x86_64.rpm];
>>> print "1 [$x]\n\n";
>>> 
>>> $x~~s/ $( Q[</a>] )  *  $( Q[a href="] ) / /;
>>> print "2 [$x]\n\n";
>>> 
>>> 
>>> 
>>> 1 [wine-7.12-3.fc37.i686.rpm</a>    23-Jul-2022 19:11  11K   <a 
>>> href="wine-7.12-3.fc37.x86_64.rpm]
>>> 
>>> 2 [wine-7.12-3.fc37.i686.rpm</a>    23-Jul-2022 19:11  11K   < 
>>> wine-7.12-3.fc37.x86_64.rpm]
>>> 
>>> 
>>> 
>>> My goal is to have `2` print the following out
>>> 
>>> wine-7.12-3.fc37.i686.rpm wine-7.12-3.fc37.x86_64.rpm
>>> 
>>> 
>>> Many thanks,
>>> -T


 > On 6/18/23 12:10, Joseph Brenner wrote:
> References: <[email protected]>
> 
> Try something like this, perhaps:
> 
>      $x ~~ s:i/ ^ (.*?) '</a>' .*?  '<a href="' (.*?) $ /$0  $1/;
> 
> Some explanations:
> 
>    s:i
> 
> The :i modifier makes it case insensitive, so data with upper-case
> html won't break things.
> 
> In general, you want to break it down into chunks, and just keep the
> chunks you want.
> 
> ^   begin matching at the start of the string
> 
> (.*?)   match anything up to the next pattern, *and* capture it to a variable
> 
> '...'   I'm using single quotes on the literal strings
> 
> $  match all the way to the end of the string.
> 
> Pinning the match with ^ and $ means a s/// will replace the entire string.
> 
> There are two captures, so they load $0 and $1, and here we're using
> them in the replace string:    s/.../$0 $1/

Hi Joseph,

Right under my nose!  Thank you.

This is my test program:

<RegexTest.pl6>
#!/bin/raku

print "\n";
my Str $x = Q[<a 
href="wike-2.0.1-1.fc38.noarch.rpm">wike-2.0.1-1.fc38.noarch.rpm</a> 
27-Apr-2023 01:53  143K] ~
             Q[<a 
href="wine-8.6-1.fc38.i686.rpm">wine-8.6-1.fc38.i686.rpm</a> 
19-Apr-2023 21:48  11K] ~
             Q[<a 
href="wine-8.6-1.fc38.x86_64.rpm">wine-8.6-1.fc38.x86_64.rpm</a> 
                 19-Apr-2023 21:48     11K] ~
             Q[<a 
href="wine-alsa-8.6-1.fc38.i686.rpm">wine-alsa-8.6-1.fc38.i686.rpm</a> 
  19-Apr-2023 21:48  223K];

$x~~m:i/  .*? ("wine")  (.*?)  $(Q[">] )  .*?  $( Q[a href="] )  (.*?) 
( $(Q[">] ) )  /;

print "0 = <$0>\n1 = <$1>\n2 = <$2>\n\n";

my Str $y = $0 ~ $1 ~ " " ~ $2;
print "$y\n\n";
</RegexTest.pl6>


$ RegexTest.pl6

0 = <wine>
1 = <-8.6-1.fc38.i686.rpm>
2 = <wine-8.6-1.fc38.x86_64.rpm>

wine-8.6-1.fc38.i686.rpm wine-8.6-1.fc38.x86_64.rpm



An aside:  /$0$1 $2/ did not work in (so I switched to "m")

$x~~s:i/  .*? ("wine")  (.*?)  $(Q[">] )  .*?  $( Q[a href="] )  (.*?) 
( $(Q[">] ) )  /$0$1 $2/;


The result is

wine-8.6-1.fc38.i686.rpm 
wine-8.6-1.fc38.x86_64.rpmwine-8.6-1.fc38.x86_64.rpm</a> 
         19-Apr-2023 21:48     11K<a 
href="wine-alsa-8.6-1.fc38.i686.rpm">wine-alsa-8.6-1.fc38.i686.rpm</a> 
  19-Apr-2023 21:48  223K


Is this a bug or did I write it wrong?

-T
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.