Perl:从字符串中提取不同的模式

时间:2019-01-28 13:17:19

标签: regex string perl

我想从长字符串中提取根据a[a-z]的模式,并仅输出不同的值。例如,$x

中的以下字符串
perl -e "$x = 'abx1acy2acz3ab'";

结果应为:

ab
   交流

问题:没有规则将记录/字符串拆分为一个数组,这使得提取模式变得容易。

3 个答案:

答案 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)

click for Demo

说明:

  • (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

$