정규 표현식
/ / 사이에 문자열을 넣으면 정규표현식이 된다.
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 |