Perl은 정규 표현식을 다루는 데 매우 강력한 언어입니다. 일치를 위해 =~ 및 !~ 연산자를 사용합니다.
정규 표현식의 수정자:
i — 대소문자를 구분하지 않음g — 전역 검색 (모든 항목 찾기)m — 다중 행 모드 (각 행에 대해 ^ 및 $가 작동)s — 점 (.)이 새 줄 문자를 포함함예시:
my $text = "My email: max@mail.com and ann@ya.ru."; while ($text =~ /([\w.]+@[\w.]+)/g) { print "Email: $1 "; }
이 예제에서 루프는 문자열에서 모든 이메일을 추출합니다.
일치 후, 값은 특별한 변수 $1, $2, ... (각 캡처 그룹에 따라)에 저장됩니다.
정규 표현식에서 실패한 검색 후 변수 $1에 무엇이 저장됩니까?
답변:
$1은 실패한 일치 시 업데이트되지 않으며, 마지막 성공적인 일치 값을 저장합니다. 이는 잠재적인 오류의 원인이 될 수 있습니다! 따라서 복잡한 조건에서는$1,$2, ...를 명시적으로 지우는 것이 좋습니다.
이야기
복잡한 정규 표현식으로 입력 데이터를 유효성 검사하는 것에
$1의 값이 의존했습니다. 적합한 문자열을 찾지 못한 후, 변수$1은 변경되지 않았고, 처리는 이전 잘못된 이메일 주소로 진행되었습니다.
이야기
프로그래머가 수정자를 잘못 설정했습니다. 대형 텍스트에서
/abc/g를 사용하여 다중 행 모드로 기대했지만, 결과적으로 패턴이 줄 바꿈이 있는 필요한 문자열을 찾지 못했습니다. 대신,/abc/ms를 사용해야 했습니다.
이야기
프로젝트에서 모든 항목을 찾기 위해 전역 플래그
/g를 사용하는 것을 잊었습니다. 결과적으로 스크립트는 첫 번째 일치 항목만 추출하고, 사용자는 전체 데이터 목록을 기다렸습니다.