본문 바로가기

Script/Perl

15. Regular Expression 1 - 기본

 
 
 
정규 표현식
 
/ / 사이에 문자열을 넣으면 정규표현식이 된다.
 
http://regexr.com/ 에서 쉽게 정규 표현식에 대한 테스트를 수행할 수 있다.
 
 
 
메타문자
 
정규 표현식(정규식, regular expression)에서 메타 문자(meta character)들은
 
특별한 뜻이 담기어 문자열 양식을 나타내는 데에 쓰인다.
 
앞으로 살펴볼 수량자, 앵커, 역참조 모두 메타문자중 일부이며
 
각 메타문자는 우선순위가 있다.
 
 
 
문자 집합과 축약
 
문자 집합
축약표현
[0-9] 모든 숫자 
\d
[A-Za-z0-9] 단어를 구성하는 문자
\w 
[\f\t\m\r] 모든 공백 문자
\s 
[\t ] 가로 공백
\h
[\f\n\r] 세로 공백
\v 
모든 종류 줄바꿈
\R
 
 
수량자
 
기호 
뜻 
.
점은 언제나 \n문자를 제외한 임의 문자열 하나와 일치한다. 
바로 앞의 요소 0번 이상 일치한다
바로 앞의 요소 1번 이상 일치한다. 
?
바로 앞의 요소 0번 또는 1번 일치한다. 
() 
요소를 묶기 위해 사용된다. 
|
or 를 의미한다
{n}
앞의 요소가 n 번 반복됨을 의미한다. 
 
 
 
수량자 예시
 
/bet.y/ 패턴은 .이 \n문자를 제외한 어떠한 한 문자를 일치 시킬 수 있음.
ex) betty, betay, bet=y 와 일치.
 
/fred\t*barney/는 fred와 barney 사이의 탭 문자가 몇개 있든지 일치시킬 수 있음.
ex) fred\t\tbarney, fred\t\t\tbarney 와 일치 
 
/fred +barney은 fred와 barney 사이에 단 하나의 빈 칸이 있거나 여러개 있을때 일치
ex) fred barney, fred     barney 와 일치 fredbarney 불일치
 
/fred+/ 퍁턴은 fredddddddd문자열과 일치 ()을 통한 fred 일치시키기
 
ex) /(fred)+/ 이렇게 쓰면 fredfredfred와 일치
 
/fred( +|\t+)barney => fred  와 barney  사이에 공백 또는 탭문자 있음 일치
 
(.){5} 는 아무문자 5개를 의미한다.
 
 
 
역참조
 
정규표현식 역참조란 괄호를 이용해서 일치시킨 문자를 참조하려면
 
\1과 \2와 같이 숫자 앞에 역슬래시를 붙여서 역참조를 표시한다.
 
Perl 에서는 $1 , $2 도 같은 의미를 가진다.
 
숫자는 첫번째 괄호인지 두번째 괄호인지를 말한다.
 
$_ = "abba";
if (/(.)\1/) {
print "It matched same character next to itself!\n";
 
}
 
(a)(a) => 불일치
 
 
$_ = "yabba dabba doo";
 
if (/y(....) d\1/) { y뒤에 오는 4개 문자가 d뒤에 오는 4개 문자가 일치하면 True이다. abba가 일치. 
print "It matched the same after y and d!\n";
 
}
 
$_ = "yabba dabba doo";
 
if (/y(.)(.)\2\1/) { y(a)(b) (2번째 괄호 역참조) (첫번째 괄호 역참조) = yabba => 일치
print "It matched a after y \n";
 
}
 
 
 
역참조 그룹핑
 
아래 예에서 a뒤에오는 11을 일치 시켜서 True로 만들고 싶어하는 식인데, 위의 식은 False다.
 
이유는 Perl이 개행이 \111로 계산하기 때문인데, 
 
 
 
$_ = "aa11bb";
 
if (/(.)\111/) {
print "It matched!\n";
}
 
 
 
이럴땐 \1을 \g{n} 이런식으로 참조해주면 된다.
 
$_ = "aa11bb";
if (/(.)\g{1}11/) {
print "It matched!\n";
 
}
 
 
 
 정규표현식 상대적 역참조
 
\1 \2 은 앞에서부터 차례대로 순서를 센 괄호의 순서였다.
 
상대적 역참조란 자신의 위치부터 몇번째 위치에 있는 괄호인지 찾는 방식이다. 
 
역참조는 괄호가 앞에 한개 더 쓰게 되면 뒤에 \n 숫자들을 전부 변경해야하지만,
 
상대적 역참조는 뒤에서부터 숫자를 세기 때문에 앞에 추가만 해주면 되서 수정이 줄어든다.
 
use 5. 010 ;
 
$ _ = "xaa11bb" ;
 
if (/(.)(.)\g{-1}11/ ) {
 
print "It matched!\n";
 
}
 
#(x)(a)(a)11 => 일치
 
 
 
 
 

'Script > Perl' 카테고리의 다른 글

18. Package  (0) 2020.01.21
17. Module  (0) 2020.01.21
14. Class  (0) 2020.01.21
13. Sub Routine  (0) 2020.01.21
12. Reference  (0) 2020.01.21