0

URL を指定すると、次の正規表現を使用して、URL の特定のポイントで単語を挿入/置換できます。

コード:

#!/usr/bin/perl

use strict;
use warnings;
#use diagnostics;

my @insert_words = qw/HELLO GOODBYE/;
my $word = 0;
my $match;

while (<DATA>) {
    chomp;
    foreach my $word (@insert_words)
    {
        my $repeat = 1;
        while ((my $match=$_) =~ s|(?<![/])(?:[/](?![/])[^/]*){$repeat}[^/]*\K|$word|)
        {
            print "$match\n";
            $repeat++;
        }

    print "\n";
    }
}

__DATA__
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/
10.15.16.17/dog/cat/rabbit/

与えられた出力 (単語__DATA__を含む最初の例の url の場合):HELLO

http://www.stackoverflow.com/dogHELLO/cat/rabbit/
http://www.stackoverflow.com/dog/catHELLO/rabbit/
http://www.stackoverflow.com/dog/cat/rabbitHELLO/
http://www.stackoverflow.com/dog/cat/rabbit/HELLO

私が今立ち往生している場所:

出力が以下のようになるように、正規表現を変更したいと思います。

http://www.stackoverflow.com/dogHELLO/cat/rabbit/
http://www.stackoverflow.com/dog/catHELLO/rabbit/
http://www.stackoverflow.com/dog/cat/rabbitHELLO/
http://www.stackoverflow.com/dog/cat/rabbit/HELLO
#above is what it already does at the moment
#below is what i also want it to be able to do as well
http://www.stackoverflow.com/HELLOdog/cat/rabbit/  #<-puts the word at the start of the string
http://www.stackoverflow.com/dog/HELLOcat/rabbit/
http://www.stackoverflow.com/dog/cat/HELLOrabbit/
http://www.stackoverflow.com/dog/cat/rabbit/HELLO
http://www.stackoverflow.com/HELLO/cat/rabbit/  #<- now also replaces the string with the word
http://www.stackoverflow.com/dog/HELLO/rabbit/
http://www.stackoverflow.com/dog/cat/HELLO/
http://www.stackoverflow.com/dog/cat/rabbit/HELLO

しかし、1つの正規表現内でこれを自動的に行うのに問題があります。

この問題について何か助けていただければ幸いです。

4

3 に答える 3

1

もう1つの解決策:

#!/usr/bin/perl

use strict;
use warnings;

my @insert_words = qw/HELLO GOODBYE/;

while (<DATA>) {
    chomp;
    /(?<![\/])(?:[\/](?![\/])[^\/]*)/p;
    my $begin_part = ${^PREMATCH};
    my $tail = ${^MATCH} . ${^POSTMATCH};
    my @tail_chunks = split /\//, $tail; 

    foreach my $word (@insert_words) {                      
        for my $index (1..$#tail_chunks) {
            my @new_tail = @tail_chunks;

            $new_tail[$index] = $word . $tail_chunks[$index];
            my $str = $begin_part . join "/", @new_tail;
            print $str, "\n";

            $new_tail[$index] = $tail_chunks[$index] . $word;
            $str = $begin_part . join "/", @new_tail;  
            print $str, "\n";
        }

        print "\n";
    }
}

__DATA__
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/
10.15.16.17/dog/cat/rabbit/
于 2013-03-01T17:10:16.867 に答える
1

1 つの解決策:

use strict;
use warnings;

use URI qw( );

my @insert_words = qw( HELLO );

while (<DATA>) {
   chomp;
   my $url = URI->new($_);
   my $path = $url->path();

   for (@insert_words) {
      # Use package vars to communicate with /(?{})/ blocks.
      local our $insert_word = $_;
      local our @paths;
      $path =~ m{
         ^(.*/)([^/]*)((?:/.*)?)\z
         (?{
            push @paths, "$1$insert_word$2$3";
            if (length($2)) {
               push @paths, "$1$insert_word$3";
               push @paths, "$1$2$insert_word$3";
            }
         })
         (?!)
      }x;

      for (@paths) {
         $url->path($_);
         print "$url\n";
      }
   }
}

__DATA__
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/
http://10.15.16.17/dog/cat/rabbit/
于 2013-03-01T16:47:55.660 に答える
1

クレイジーな正規表現なし:

use strict;
use warnings;

use URI qw( );

my @insert_words = qw( HELLO );

while (<DATA>) {
   chomp;
   my $url = URI->new($_);
   my $path = $url->path();

   for my $insert_word (@insert_words) {
      my @parts = $path =~ m{/([^/]*)}g;
      my @paths;
      for my $part_idx (0..$#parts) {
         my $orig_part = $parts[$part_idx];
         local $parts[$part_idx];
         {
            $parts[$part_idx] = $insert_word . $orig_part;
            push @paths, join '', map "/$_", @parts;
         }
         if (length($orig_part)) {
            {
               $parts[$part_idx] = $insert_word;
               push @paths, join '', map "/$_", @parts;
            }
            {
               $parts[$part_idx] = $orig_part . $insert_word;
               push @paths, join '', map "/$_", @parts;
            }
         }
      }

      for (@paths) {
         $url->path($_);
         print "$url\n";
      }
   }
}

__DATA__
http://www.stackoverflow.com/dog/cat/rabbit/
http://www.superuser.co.uk/dog/cat/rabbit/hamster/
http://10.15.16.17/dog/cat/rabbit/
于 2013-03-01T16:56:35.230 に答える