正则表达式,提取匹配为多数组

时间:2013-11-21 00:20:02

标签: regex perl

问题:

$val1="alecosja niewiemcosja hehehcosja lelele ojejcosja ktoscosktos coskurw";
#list context:
@myarray=$val1=~m/([eh])cos(ja|kt|ku)/g;

@myarray将保留括号中的子串

结果print "$_\n" (foreach (@myarray))

e \n ja \n h \n ja 

有没有办法解决这个问题:

$myarray[0][0] - first whole match, 
$myarray[0][1] - first substring from first match, 
$myarray[0][2] - second substring from first match
$myarray[1][0] - seonds whole match, 
$myarray[1][1] - first substring from second match etc.

这是一种PHP新手的想法,但我该如何处理这些问题?

2 个答案:

答案 0 :(得分:1)

不是直接的,但这会让你获得95%的胜利:

  DB<1> $val1="alecosja niewiemcosja hehehcosja lelele ojejcosja ktoscosktos coskurw";

  DB<2> @myarray=$val1=~m/(([eh])cos(ja|kt|ku))/g

  DB<3> x @myarray
0  'ecosja'
1  'e'
2  'ja'
3  'hcosja'
4  'h'
5  'ja'

如果您还不知道如何操作,那么学习如何使用Perl命令行调试器将非常有用。

答案 1 :(得分:1)

如评论中所述,为什么要为自己制造困难?使用while循环将允许您直接访问每个匹配的内置变量:

use strict;
use warnings;
use Data::Dumper;

my $val = "alecosja niewiemcosja hehehcosja lelele ojejcosja ktoscosktos coskurw";
my @result;
while ($val =~ m/([eh])cos(ja|kt|ku)/g) {
    push @result, [ $&, $1, $2 ];          # save matches
}
print Dumper \@result;

输出:

$VAR1 = [
          [
            'ecosja',
            'e',
            'ja'
          ],
          [
            'hcosja',
            'h',
            'ja'
          ]
        ];