정규식에는 많은 특수문자가 있으며, 이들로인해 정규식은 보다 강력해지지만 다소 복잡해지는 경향이 있다. 따라서 정규식은 주의깊게 사용할 필요가 있다.
다음은 특수 정규식 문자와 이들의 의미이다.
. # 개행문자를 제외한 임의의 한문자
^ # 행이나 문자열의 시작
$ # 행이나 문자열의 끝
* # 영개 이상의 마지막 문자
+ # 한개 이상의 마지막 문자
? # 영 또는 한개의 마지막 문자
다음은 정규식의 몇몇 예이다. 정규식을 사용하기위해 /.../로 감쌌다는 것을 기억하기 바란다.
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 # 단어
$, |, [, ), \, /등과 같은 문자는 분명히 정규식에서 고유한 의미를 갖는다. 만약 이들 문자중 하나를 일치시키려면 이들 문자앞에 역슬래쉬를 두어야 한다.
if($FORM{name} ne '' && $FORM{comment} ne '') {
# 방명록 파일을 읽어 @line에 저장한다.
open(F, "$guestreal");
@line = <F>;
close(F);
# @line에 방명록 데이터가 저장되어 있으므로 방명록 파일을 생성 모드로
# 연다.
open(F, ">$guestreal");
for(0..$#line) {
if($line[$_] =~ /<!--begin-->/) {
# 검색한 문장중에 <!--begin-->이 있으면 이 행은
# <!--begin-->과 사용자 입력으로 대치된다.
print F "<!--begin-->\n";
&save_guestbook;
}else {
# 검색한 문장중에 <!--begin-->이 없으면 이 행은 원래의 행이
# 저장된다.
print F $line[$_];
}
}
close(F);
print "location: $guesturl\n\n";
}else {
print "content-type: text/html\n\n";
&guest_form;
}
동작원리
위의 if문은 <!--begin-->이라는 문자열을 검색해서 <!--begin-->이라는 문자열이 검색되는 경우에는 다음 그림처럼 <!--begin-->을 <!--begin-->과 사용자의견으로 대치하게된다. <!--begin-->이 검색되지 않는 경우에는 원래의 문장을 그대로 저장하므로 사용자의 의견을 앞부분에 추가할 수 있다.
<!--begin-->을 출력할 때 사용자의 의견을 먼저 출력하고 <!--begin-->을 출력하면 사용자의 의견은 뒷부분에 추가된다.