Program Tip

Perl의 배열에 정규식 캡처를 어떻게 저장할 수 있습니까?

programtip 2020. 11. 27. 21:13
반응형

Perl의 배열에 정규식 캡처를 어떻게 저장할 수 있습니까?


Perl에서 정규식을 사용하려고합니다. 내가 궁금한 점은 표현식에 대한 모든 일치 항목을 배열에 저장할 수 있는지 여부입니다. 다음을 사용할 수 있다는 것을 알고 있습니다. ($1,...,$n) = m/expr/g;하지만 찾고있는 일치 수를 알고있는 경우에만 사용할 수있는 것 같습니다. 시도 my @array = m/expr/g;했지만 작동하지 않는 것 같습니다.

당신의 도움을 주셔서 감사합니다!


전역 일치 ( /g)를 수행하는 경우 목록 컨텍스트의 정규식은 캡처 된 모든 일치를 반환합니다. 간단하게 :

my @matches = ( $str =~ /pa(tt)ern/g )

예를 들어이 명령은 다음과 같습니다.

perl -le '@m = ( "foo12gfd2bgbg654" =~ /(\d+)/g ); print for @m'

출력을 제공합니다.

12
2
654

"목록 컨텍스트에서 일치" 에서 perldoc perlop대한 수동 항목을 참조하십시오 .

/ g 옵션을 사용하지 않으면 목록 컨텍스트의 m //는 패턴의 괄호로 일치하는 하위 표현식으로 구성된 목록을 반환합니다. 즉, ($ 1, $ 2, $ 3 ...)

/ g 수정자는 전역 패턴 일치, 즉 문자열 내에서 가능한 한 여러 번 일치를 지정합니다. 작동 방식은 상황에 따라 다릅니다. 목록 컨텍스트에서 정규 표현식의 캡처 괄호와 일치하는 하위 문자열 목록을 반환합니다. 괄호가 없으면 전체 패턴 주위에 괄호가있는 것처럼 일치하는 모든 문자열의 목록을 반환합니다.

배열에 할당하거나 목록 컨텍스트에서 평가를 수행하여 모든 일치 항목을 간단히 가져올 수 있습니다.

my @matches = ($string =~ m/word/g);

때로는 PHP처럼 모든 일치 항목을 전역 적으로 가져와야 preg_match_all합니다. 귀하의 경우라면 다음과 같이 작성할 수 있습니다.

# a dummy example
my $subject = 'Philip Fry Bender Rodriguez Turanga Leela';
my @matches;
push @matches, [$1, $2] while $subject =~ /(\w+) (\w+)/g;

use Data::Dumper;
print Dumper(\@matches);

그것은 인쇄

$VAR1 = [
          [
            'Philip',
            'Fry'
          ],
          [
            'Bender',
            'Rodriguez'
          ],
          [
            'Turanga',
            'Leela'
          ]
        ];

나는 이것이 자명 한 예라고 생각합니다. /g첫 번째 정규식의 수정 자 참고 :

$string = "one two three four";

@res = $string =~ m/(\w+)/g;
print Dumper(@res); # @res = ("one", "two", "three", "four")

@res = $string =~ m/(\w+) (\w+)/;
print Dumper(@res); # @res = ("one", "two")

lvalue가 목록 컨텍스트에 있는지 확인해야합니다. 즉, 스칼라 값을 괄호로 묶어야합니다.

($one, $two) = $string =~ m/(\w+) (\w+)/;

경기당 필요한 캡처 그룹의 수를 알고있는 경우이 간단한 접근 방식을 사용할 수 있습니다. 예를 들어 설명합니다 (캡처 그룹 2 개).

다음과 같은 '데이터'가 있다고 가정합니다.

my $mess = <<'IS_YOURS';
Richard     Rich
April           May
Harmony             Ha\rm
Winter           Win
Faith     Hope
William         Will
Aurora     Dawn
Joy  
IS_YOURS

다음 정규식으로

my $oven = qr'^(\w+)\h+(\w+)$'ma;  # skip the /a modifier if using perl < 5.14

아래에있는 12 개 (8 개가 아닌 6 개 ... 하모니가 탈출하고 조이가 사라짐)를 모두 캡처 할 수 @box있습니다.

my @box = $mess =~ m[$oven]g;

상자의 세부 정보를 "해시"하려면 다음과 같이하면됩니다.

my %hash = @box;

아니면 그냥 상자를 완전히 건너 뛸 수도 있었지만

my %hash = $mess =~ m[$oven]g;

Note that %hash contains the following. Order is lost and dupe keys (if any had existed) are squashed:

(
          'April'   => 'May',
          'Richard' => 'Rich',
          'Winter'  => 'Win',
          'William' => 'Will', 
          'Faith'   => 'Hope',
          'Aurora'  => 'Dawn'
);

참고URL : https://stackoverflow.com/questions/2304577/how-can-i-store-regex-captures-in-an-array-in-perl

반응형