有字符串“-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
答案 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";