수색…


문자열 일치

=~ 연산자는 일반 표현식 ( / 구분하여 설정)을 문자열과 일치 시키려고 시도합니다.

my $str = "hello world";
print "Hi, yourself!\n" if $str =~ /^hello/;

/^hello/ 는 실제 정규 표현식입니다. ^ 는 정규 표현식에 문자열의 시작 부분부터 시작하여 어딘가에서 중간 부분과 일치하지 않는다는 것을 알려주는 특수 문자입니다. 그런 다음 정규 표현식은 h , e , l , lo 순서로 다음 문자를 찾습니다.

정규식은 노출 된 경우 기본 변수 ( $_ )를 찾습니다.

$_ = "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