通过perl从字符串中提取数据

时间:2016-10-05 08:00:23

标签: regex perl

有字符串“-test aaaa -machine bbb -from ccc”

如何使用常规提取“aaaa”,“bbb”,“ccc”?

甚至字符串是“-from ccc -test aaaa -machine bbb”
(不同的顺序,几个空间....)

我曾尝试过一些代码,但总是收到无效数据。

$str = "-test aaaa     -machine  bbb  -from ccc";
$str =~ /-test\s*(.*)\s*/;

打印

aaaa   -machine  bbb  -from ccc

我也想处理以下案例

-test aa_aa -machine aab-baa-aba -from ccc

4 个答案:

答案 0 :(得分:7)

您不必使用正则表达式,您可以使用哈希值。

function swaprev($str){
    $str = str_split($str);
    $lc = $str[count($str)-1];
    $fc = $str[0];             
    $str[0] = $lc; $str[count($str)-1] = $fc;
    return implode('',$str);
}

$array = explode(" ", "textarea where you cant put text");
$array_out = [];
foreach($array as $lijst){
    if (strlen($lijst) > 4)
        $array_out[] = swaprev($lijst);
    else
        $array_out[] = $lijst;
}

echo implode(" ", $array_out);

输出:

  <option value="name" selected>Aanhef</option>

无论订单是什么,use strict; use warnings; use Data::Dumper; my $str = '-test aaaa -machine bbb -from ccc'; my %field = split ' ', $str; print Dumper(\%field); 都会返回一对数组(形状为$VAR1 = { '-from' => 'ccc', '-machine' => 'bbb', '-test' => 'aaaa' }; split[word1, word2, word3, word4, word5, word6]word1将是word3)当分配给哈希时,以现在的方式创建它,如果你想在word5之后得到字符串,你只需输入-field_name即可访问它无论你想要什么。

编辑:即使单词之间有多少空格或单词中有哪些字符,也无关紧要。只要您将其保留为-test

格式,它对所有情况的工作方式都相同

答案 1 :(得分:6)

我会回答(我认为)问题的问题 - 不是你提出的问题。

在我看来,您正在解析命令行选项。所以使用命令行选项解析器,而不是为自己重新创建。 Getopt::Long是标准Perl发行版的一部分。

#!/usr/bin/perl

use strict;
use warnings;
# We use modern Perl (here, specifically, say())
use 5.010;

use Getopt::Long 'GetOptionsFromString';
use Data::Dumper;

my %options;

my $str = '-test aa_aa -machine aab-baa-aba -from ccc';
GetOptionsFromString($str, \%options, 'test=s', 'machine=s', 'from=s');

say Dumper \%options;

通常,您在解析GetOptions()中可用的命令行选项时使用函数@ARGV。我不确定这些选项是如何在您的字符串中结束的,但对于这种情况,它有一个有用的GetOptionsFromString()函数。

更新:解释您的代码无效的原因。

$str = "-test aa_aa     -machine  aab-baa-aba  -from ccc";
$str =~ /-test\s*(.*)\s*/;

您正在捕捉匹配(.*)的内容。但是.*是贪婪的。也就是说,它尽可能多地匹配数据。并且,在这种情况下,这意味着它匹配到行的结尾。 (至少!)有两种方法可以解决这个问题。

1 /通过添加?使比赛变得非贪婪。

$str =~ /-test\s*(.*?)\s*/;

2 /更明确地了解您正在寻找的内容 - 在这种情况下是非空白字符。

$str =~ /-test\s*(\S*)\s*/;

答案 2 :(得分:1)

my @matches;
my $regex = qr/-\w+\s+([\w-]+)/;

my $string = q{-test aaaa -machine bbb -from ccc};
@matches = $string =~ /$regex/g;
print "Matches for first string are: @matches\n";

my $other_string = q{-from   ccc   -test    aaaa    -machine bbb};
@matches = $other_string =~ /$regex/g;
print "Matches for second string are: @matches\n";

my $third_string = q{-test aa_aa -machine aab-baa-aba -from ccc};
@matches = $third_string =~ /$regex/g;

print "Matches for third string are: @matches";

答案 3 :(得分:-2)

这应该可以解决问题

$str = "-test aa_aa     -machine  aab-baa-aba  -from ccc";
($test,$machine,$from) = $str =~ /\-test(.+)\-machine(.+)\-from(.+)/;

print "Test: $test, Machine: $machine, From: $from";