我想从长字符串中提取根据a[a-z]
的模式,并仅输出不同的值。例如,$x
perl -e "$x = 'abx1acy2acz3ab'";
结果应为:
ab
交流
问题:没有规则将记录/字符串拆分为一个数组,这使得提取模式变得容易。
答案 0 :(得分:6)
如果您想要唯一的数据,请考虑使用哈希。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
$_ = 'abx1acy2acz3ab';
my %seen;
for (/(a[a-z])/g) {
say $_ unless $seen{$_}++;
}
答案 1 :(得分:5)
通过此正则表达式,您将获得不同的模式(如果您不关心它们的顺序):
(a[a-z])(?!.*\1)
说明:
(a[a-z])
-匹配字母a
,然后匹配范围a-z
中的任何其他字母。内容在第1组中捕获(?!.*\1)
-前瞻,以确保第1组的内容不在字符串的后面。答案 2 :(得分:3)
另一种Perl单线版
$ perl -le ' $x="abx1acy2acz3ab" ;%kv=$x=~/(a[a-z])((?<=.))/g; $,="\n"; print keys %kv '
ac
ab
$
与另一个输入:
$ perl -le ' $x="abxaxy2acz3ab" ; %kv=$x=~/(a[a-z])((?<=.))/g; $,="\n"; print keys %kv '
ax
ab
ac
$