준호씨의 블로그

perl - regex escape search string 본문

개발이야기

perl - regex escape search string

준호씨 2016. 11. 19. 16:45
반응형


perl 로 cgi 나 스크립트를 작성할 때 문자열을 파싱해서 사용하는 경우가 많다. 그럴 때 정규표현식을 쓰게 되는데 간혹 특수 문자를 정규표현식에 넣다 보면 문제가 발생하곤 한다. 검색어를 정규표현식에 넣어서 검색을 할 때 검색어에 "+apple" 를 넣게 되면 + 가 특수 문자이기 때문에 오류가 발생하거나 오동작 하게 된다.

오류 발생
Quantifier follows nothing in regex; marked by <-- HERE in m/+ <-- HERE apple/ at regtest.pl line 14.

단순 escape
단순히 + -> \+ 변환 해 주는 함수를 만들어서 사용 해 볼 수 있다.
sub escape_regex {
    my $self = shift;

    my $src = shift;
    $src =~ s/\+/\\+/g;
    return $src
}
별로 좋은 방법은 아니다. 다른 특수 문자들은 처리 할 수 없기 때문이다. 다른 특수 문자가 발견 될 때 마다 저 함수부터 고쳐 줘야 될 것이다.

/\Q내용\E/
검색어의 앞에 \Q 뒤에 \E 를 넣어 주는 방법이다. 무난한 방법이다.
my $keyword = "+apple";

if ($contents =~ /\Q$keyword\E/) {
  print("correct\n");
}
다만 \Q \E 가 뭔지 모르는 사람이 코드를 보면 좀 어려워 할 수 있다.

quotemeta 함수 이용
quotemeta 함수를 이용하면 좀 더 직관적이다.
my $keyword = "+apple";
my $quoted_keyword = quotemeta($keyword);

if ($contents =~ /$quoted_keyword/) {
  print("correct\n");
}
다만 일반적으로 escape 를 생각하게 되는데 quote 라고 해서 좀 어색 하긴 하다.

선택
생각보다 quotemeta 라는 함수명이 어색해서 \Q \E 방식을 사용하고 있다. 좀 더 쓰다 보면 뭐가 더 좋은지 느끼게 되겠지.

참고
quotemeta

반응형
Comments