Perl Language
정규 표현식
수색…
문자열 일치
=~
연산자는 일반 표현식 ( /
구분하여 설정)을 문자열과 일치 시키려고 시도합니다.
my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;
/^hello/
는 실제 정규 표현식입니다. ^
는 정규 표현식에 문자열의 시작 부분부터 시작하여 어딘가에서 중간 부분과 일치하지 않는다는 것을 알려주는 특수 문자입니다. 그런 다음 정규 표현식은 h
, e
, l
, l
및 o
순서로 다음 문자를 찾습니다.
정규식은 노출 된 경우 기본 변수 ( $_
)를 찾습니다.
$_ = "hello world";
print "Ahoy!\n" if /^hello/;
정규 표현식 앞에 m
연산자를 사용하는 경우 다른 구분 기호를 사용할 수도 있습니다.
m~^hello~;
m{^hello};
m|^hello|;
/
문자가 포함 된 문자열을 일치시킬 때 유용합니다.
print "user directory" if m|^/usr|;
패턴 매칭에서 \ Q와 \ E의 사용법
\ Q와 \ E 사이에있는 문자는 일반 문자로 처리됩니다.
#!/usr/bin/perl
my $str = "hello.it's.me";
my @test = (
"hello.it's.me",
"hello/it's!me",
);
sub ismatched($) { $_[0] ? "MATCHED!" : "DID NOT MATCH!" }
my @match = (
[ general_match=> sub { ismatched /$str/ } ],
[ qe_match => sub { ismatched /\Q$str\E/ } ],
);
for (@test) {
print "\String = '$_':\n";
foreach my $method (@match) {
my($name,$match) = @$method;
print " - $name: ", $match->(), "\n";
}
}
산출
String = 'hello.it's.me': - general_match: MATCHED! - qe_match: MATCHED! String = 'hello/it's!me': - general_match: MATCHED! - qe_match: DID NOT MATCH!
정규식으로 문자열 파싱하기
일반적으로 정규 표현식을 사용하여 복잡한 구조를 파싱하는 것은 좋지 않습니다. 그러나 그것은 할 수 있습니다. 예를 들어 하이브 테이블에 데이터를로드하고 필드를 쉼표로 구분하지만 array와 같은 복합 유형은 "|"로 구분됩니다. 파일에는 쉼표로 구분 된 모든 필드와 복합 유형이 대괄호 안에있는 레코드가 들어 있습니다. 이 경우 일회용 Perl로 충분할 수 있습니다.
echo "1,2,[3,4,5],5,6,[7,8],[1,2,34],5" | \
perl -ne \
'while( /\[[^,\]]+\,.*\]/ ){
if( /\[([^\]\|]+)\]/){
$text = $1;
$text_to_replace = $text;
$text =~ s/\,/\|/g;
s/$text_to_replace/$text/;
}
} print'
출력을 확인하는 것이 좋습니다 :
1,2, [3 | 4 | 5], 5,6, [7 | 8], [1 | 2 | 34], 5
정규식을 사용하여 문자열 바꾸기
s/foo/bar/; # replace "foo" with "bar" in $_
my $foo = "foo";
$foo =~ s/foo/bar/; # do the above on a different variable using the binding operator =~
s~ foo ~ bar ~; # using ~ as a delimiter
$foo = s/foo/bar/r; # non-destructive r flag: returns the replacement string without modifying the variable it's bound to
s/foo/bar/g; # replace all instances
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow