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
'Program Tip' 카테고리의 다른 글
Gulp uglify 출력 min.js (0) | 2020.11.27 |
---|---|
WPF의 코드 숨김을 통해 리소스에 액세스 (0) | 2020.11.27 |
Scala에서 구문 설탕의 모든 인스턴스는 무엇입니까? (0) | 2020.11.27 |
이 사용자가 익명인지 또는 실제로 내 시스템의 사용자인지 어떻게 확인합니까? (0) | 2020.11.27 |
Java에서 소수점 이하 두 자리로 반올림하는 방법은 무엇입니까? (0) | 2020.11.27 |