Monday, December 29, 2008

Remove nonword character

Lperl에서 non-word character를 regexp에서 지정하려면
\W 를 쓰면 된다.

parkinson's disease 라는 문자열에서 's를 제거한다면


$line='parkinson's disease';
$line=~s/\Ws//;


와 같이 쓸 수 있다.

그러나 윈도우 시스템에서 특수 문자로 지정된 " ' " 는 하나의
위의 정규식으로 처리되지 않는다.

대신

$line=~s/\W+s//;


를 써야 제대로 동작한다. 윈도우 특수 문자의 경우 non-word character가
리눅스 시스템에서 하나 이상의 character로 표현되는 경우가 많기 때문이다.

오늘 맞부닥친 특수 문자의 경우 3개의 문자로 구성되어 있었다.
이것 때문에 삽질을 장시간 ㅜㅜ

2 comments:

  1. 's에서 '는 '가 아니고 ’인 것 같군요 '는 1byte ASCII문자 이지만 ’는 euc-kr의 2byte문자인 것 같은데 이 경우 윈도우 리눅스에서 전각으로 다루냐 반각으로 다루냐의 차이 같습니다. 일단 멀티바이트 문자가 포함된 문자열에 대해서 정규식을 적용할 때는 Perl이 문자의 경계를 인식하지 못하고 바이트 단위로 처리합니다. 따라서 플랫폼에 따라 저런 다른 결과가 나올 수 있어보이고요. 이때는 어떤 인코딩의 문자열을 Perl 내부 유니코드 포멧으로 변환시키고 나면 각종 문자열 함수와 정규식도 문자단위로 동작합니다. 다음코드는 윈도우에서도 제대로 동작합니다. 따라서 ASCII영역을 벗어난 문자가 포함되는 문자열을 정규식으로 다룰 때는 문자열을 Perl내부 유니코드 포멧으로 변경해서 하는 것이 좋습니다.

    #!/usr/bin/perl
    use strict;
    use warnings;
    use Encode;
    my $line = q{parkinson’s disease};
    $line = decode('cp949',$line);
    $line =~s/\Ws//;
    print $line,"\n";

    ReplyDelete
  2. 앗, perl guru aero님 반갑습니다! 저런 방법이 있었군요. 코멘트 감사드립니다

    ReplyDelete