我试图在一行的两个点之间获取文本,但我的程序返回整行。
例如:我有如下文字:
我的 perl .version 1_1 的 sampledata 1,2。
我使用了以下匹配语句
$x =~ m/(\.)(.*)(\.)/;
我的 $x 输出应该是版本 1_1,但我将整行作为我的匹配项。
在您的代码中,匹配后 $x 的值不会改变。
当 $x 与m/(.)(.*)(.)/成功匹配时,您的三个捕获组将包含 '.'、'version 1_1' 和 '.' 分别(按给定的顺序)。$2 将为您提供“版本 1_1”。
考虑到您可能只需要“版本 1_1”部分,您无需捕获这两个点。此代码将为您提供相同的结果:
$x =~ m/\.(.*)\./;
print $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
尝试这个:
my $str = "My sampledata 1,2 for perl .version 1_1.";
$str =~ /\.\K[^.]+(?=\.)/;
print $&;
句点必须从字符类中转义。
\K
重置之前匹配的所有内容(您可以用lookbehind替换它(?<=\.)
)
[^.]
指除句点以外的任何字符。
对于几个结果,您可以这样做:
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";