날짜: 1996-03-11 | 글쓴이: 도아 | 9437 번 | 프린트 | 메일로보내기

펄을 배우자 - 제 8강 문자열 일치


펄의 아주 유용한 특징(가장 유용한 특징이 아니라)중 하나는 강력한 문자열 조작 능력이다. 이 문자열 조작의 핵심에는 정규식(regular expression:RE)이 있다. 이 정규식은 많은 다른 UNIX 유틸리티에서 공유하는 기능이기도 하다. 정규식 정규식은 슬래쉬를 포함하며, =~ 연산자로 일치를 수행한다. 다음 식은 $sentence 변수내에 a) 제목 라는 문자열이 나타나면 참이된다.
$sentence =~ /a) 제목/
RE는 대소문자를 구분한다. 따라서 $sentence가
$sentence = "A) 제목 - 겁없는 토깽이";
와 같다면 위의 일치는 거짓이 된다. !~ 연산자는 일치가 발생하지 않음을 지시할 때 사용된다. 위의 예에서
$sentence !~ /a) 제목/
는 참이된다. 문자열 a) 제목이 $sentence에 나타나지 않기때문이다. $_, 특수변수
if ($sentence =~ /제목/)
{
	print "우리는 겁없는 토깽이대해 얘기하고 있었다\n";
}
와 같은 조건문을 사용할 수 있으며, $sentence가 다음중 하나라면 메시지가 출력된다.
$sentence = "제목: 겂없는 토깽이";
$sentence = "제목: 비키니와 아가씨";
그러나 이 문장을 특수 변수 $_에 할당한다면 훨씬 산뜻해진다. 특수 변수를 사용한다면 일치 연산자나 비일치 연산자를 사용하지 않고 다음과 같이 간단히 쓸 수 있다.
if (/제목/)
{
	print "우리는 겁없는 토깽이대해 얘기하고 있었다\n";
}
$_ 변수는 많은 펄 연산자에대한 기본 피연산자이며, 아주 자주 사용된다. RE 추가 정규식에는 많은 특수문자가 있으며, 이들로인해 정규식은 보다 강력해지지만 다소 복잡해지는 경향이 있다. 따라서 정규식은 주의깊게 사용할 필요가 있다. 다음은 특수 정규식 문자와 이들의 의미이다.
.	# 개행문자를 제외한 임의의 한문자
^	# 행이나 문자열의 시작
$	# 행이나 문자열의 끝
*	# 영개 이상의 마지막 문자
+	# 한개 이상의 마지막 문자
?	# 영 또는 한개의 마지막 문자
다음은 정규식의 몇몇 예이다. 정규식을 사용하기위해 /.../로 감쌌다는 것을 기억하기 바란다.
t.e	# t에 이어 임의의 문자가 나오고 e가 나오믄 패턴
	# 이 것은 
	#                 the
	#                 tie
	# 는 일치하지만 
	#         tale
	# 는 일치하지 않는다.	
^f	# f로 시작하는 행
^ftp	# ftp로 시작하는 행
e$	# e로 끝나는 행
tle$	# tle로 끝나는 행
und*	# un에 이어 영개 이상의 d 문자
	# 이 것은
	#                 und
	#                 undd
	#                 unddd (etc)
	# 를 일치시킨다.
.*	# 개행문자를 제외한 임의 개수의 모든 문자.
	# .는 개행문자를 제외한 임의의 문자를 일치시키며
	# *는 앞문자를 영개 이상 일치시킨다.
^$	# 빈줄
이 것이외에 더 많은 옵션이 있다. 대괄호는 대괄호내의 임의의 한 문자를 일치하는데 사용된다. 대괄호 내에서 -는 값과 값의 사이를 의미하며 ^로 시작하면 부정을 의미한다.
[qjk]		# q 또는 j 또는 k
[^qjk]		# q 또는 j 또는 k가 아닌
[a-z]		# a부터 z까지
[^a-z]		# 소문자 이외의 문자
[a-zA-Z]	# 영문 대소문자
[a-z]+		# 한개 이상의 소문자
이 시점에서 끝으로 건너 뛰어도 대부분의 연습을 할 수 있다. 나머지는 대부분 참조를 위한 것이다. 수직막대 |는 "또는"을 표현하며, 둥근괄호 (...)는 패턴을 묶는데 사용된다:
jelly|cream	# jelly 또는 cream
(eg|le)gs	# eggs나 legs
(da)+		# da나 dada나 dadada등...
다음 추가적인 특수문자들이다.
\n		# 개행문자
\t		# 탭
\w		# 임의의 영문자와 숫자
		# [a-zA-Z0-9_]와 같다.
\W		# 영문자와 숫자가 아닌 문자
		# [^a-zA-Z0-9_]와 같다.
\d		# 임의의 숫자. [0-9]와 같다.
\D		# 숫자가 아닌 문자. [^0-9]와 같다.
\s		# 공백문자: 공백, 탭, 개행문자등
\S		# 공백이 아닌 문자
\b		# 단어의 경계, []에서는 사용하지 못한다.
\B		# 단어
$, |, [, ), \, /등과 같은 문자는 분명히 정규식에서 고유한 의미를 갖는다. 만약 이들 문자중 하나를 일치시키려면 이들 문자앞에 역슬래쉬를 두어야 한다.
\|		# 수직막대
\[		# 좌측 대괄호
\)		# 우측 둥근괄호
\*		# 별표
\^		# ^ 기호
\/		# 슬래쉬
\\		# 역슬래쉬
정규식의 예 앞서 언급한 것처럼 정규식을 사용하는데 주의를 기울여야 한다. 여기 몇몇 예가 있다. 일치에서 이들을 사용하기위해 /.../로 감싸야 한다는 것을 기억하기 바란다.
[01]		# "0" 또는 "1"
\/0		# 영으로 나누기: "/0"
\/ 0		# 영으로 나누기(공백포함): "/ 0"
\/\s0		# 영으로 나누기(공백문자 포함):
		# "/ 0". 여기서 공백은 탭등일 수 있다.
\/ *0		# 영으로 나누기(한개이상의 공백 포함)
		#"/0" 또는 "/ 0" 또는 "/  0" 등.
\/\s*0		# 영으로 나누기(한개 이상의 공백문자 포함
\/\s*0\.0*	# 이전 예와 마찬가지 이지만 소수점을 포함한다.
		# 그리고 소수점 뒤에 몇개의 "0"이 이어질 수 있다.
		# "/0.", "/0.0", "/0.00"등과 
		# "/ 0.", "/  0.0", "/   0.00"등이 포함된다.
연습 이전의 연습에서 빈행이 아닌 줄만 세어 출력하는 프로그램을 작성했다. 이번에는 빈행이 아닌 줄이 아니라 다음과 같은 줄을 세는 프로그램으로 변경하라.
  • 문자 x
  • 문자열 제목
  • 문자열 x(x는 대소문자 모두 가능)
  • 단어 제목(대소문자에 무관). 단어 경계를 찾기위해 \b를 사용하기 바란다.
이 경우에 프로그램은 매 행을 출력하지만 지정된 행만 번호를 출력해야 한다. 일치 연산자 =~의 명시적 사용을 피하기위해 특수변수 $_를 사용하기 바란다.


다음글: 펄을 배우자 - 제 9강 대치와 변환 (6493)1996-03-12
이전글: 펄을 배우자 - 제 7강 조건문 (6150)1996-03-10

세상사는 이야기

  • 만원대 피젯 스피너를 >
  • 망하는 길을 택한 쿠팡 >
  • 물놀이에 적당한 가성 >
  • 컴퓨터를 IPTV로 2, po >
  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >
  • 탈옥의 필수, QuickDo >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2017 QAOS.com All rights reserved.