在perl中匹配

时间:2013-07-11 04:22:51

标签: perl matching

我是perl的新手。我试图在一行的两个点之间得到一个文本,但我的程序返回整行。

例如:我有一个看起来像的文本 我的采样数据1,2为perl .version 1_1。

我使用了以下匹配声明

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

$ x的输出应该是版本1_1,但我将整行作为我的匹配。

我非常感谢任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:3)

在你的代码中,$ x的值在匹配后不会改变。

当$ x与m /(.)(.*)(.)/成功匹配时,您的3个捕获组将包含“。”,“版本1_1”和“。”分别(按给定的顺序)。 $ 2将为您提供'版本1_1'。

考虑到您可能想要的仅是“版本1_1”部分,您无需捕获2个点。此代码将为您提供相同的结果:

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

答案 1 :(得分:0)

试试这个:

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);

如果您不想使用两次,您可以这样做:

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

答案 2 :(得分:0)

应该很简单,可以这样做:

#!/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