2

行の 2 つのドットの間にテキストを挿入しようとしていますが、プログラムは行全体を返します。

例: 次のようなテキストがあります。

perl .version 1_1 の私のサンプルデータ 1,2。

次の一致ステートメントを使用しました

$x =~ m/(\.)(.*)(\.)/;

$x の出力はバージョン 1_1 のはずですが、行全体を一致として取得しています。

4

3 に答える 3

1

次のようなことを行うのは簡単です。

#!/usr/bin/perl

use warnings;
use strict;

my @tests = (
    "test one. get some stuff. extra",
    "stuff with only one dot.",
    "another test line.capture this. whatever",
    "last test . some data you want.",
    "stuff with only no dots",
);

for my $test (@tests) {
   # For this example, I skip $test if the match fails,
   # otherwise, I move on do stuff with $want
   next if $test !~ /\.(.*)\./;
   my $want = $1;
   print "got: $want\n";
}

出力

$ ./test.pl
got:  get some stuff
got: capture this
got:  some data you want
于 2013-07-11T05:03:45.493 に答える
1

これを試して:

my $str = "My sampledata 1,2 for perl .version 1_1.";
$str =~ /\.\K[^.]+(?=\.)/;
print $&;

ピリオドは、文字クラスからエスケープする必要があります。

\K以前に一致したものをすべてリセットします (後読みで置き換えることができます(?<=\.))

[^.]ピリオドを除く任意の文字を意味します。

いくつかの結果について、これを行うことができます:

my $str = "qwerty .target 1.target 2.target 3.";
my @matches = ($str =~ /\.\K[^.]+(?=\.)/g);
print join("\n", @matches);

ピリオドを 2 回使用したくない場合は、次のようにします。

my $str = "qwerty .target 1.target 2.target 3.";
my @matches = ($str =~ /\.([^.]+)\./g);
print join("\n", @matches)."\n";
于 2013-07-11T04:27:41.490 に答える