정규 표현식이란 어느 특정 문자열이 아닌 문자열의 일부를 패턴화해서 표현하는 방법을 말합니다.
여러 행이 있는 문장의 안에서 문자열을 검색할 때에 검색하고 싶은 문자열 전부를 지정하는 것이 아닌 문자열의 일부분으로 검색 가능하게 하는 것이 정규식 표현입니다.
예를 들어, UNIX나 Windows에서는 문자열을 검색할 때에 사용 가능한 정규식 표현으로 [*]를 임의의 문자열에 [?]를 임의의 하나의 문자로 해서 사용할 수 있습니다.
검색 패턴을 app*으로 지정하면 apple 이나 application 또는 appeal등의 문자열이 매칭되는 것을 볼 수 있습니다.
이러한 정규식 표현 방법은 프로그램 언어마다 다르지만, Perl의 경우에는 다른 언어보다 비교적 매우 강력한 정규식 표현에 의해 패턴 매치 기능을 갖추고 있습니다.
그렇기 때문에 보다 상세하고 용이하게 패턴 매치를 사용할 수 있습니다.
패턴 매치 연산자
Perl에는 패턴 매치 연산자로 슬래시(/)로 감싼 문자열이 해당됩니다.
성격상 정규식 표현은 조건식과 병행해서 사용하는 것이 많습니다.
그 예로 다음과 같은 구문이 있습니다.
구문 | 내용 |
---|---|
if ( 문자열 =~ /패턴/) | 만약「문자열」안에「패턴」이 포함되어 있으면 |
(패턴 매치하면 참) | |
if ( 문자열 !~ /패턴/) | 만약「문자열」안에「패턴」이 포함되어 있지 않으면 |
(패턴 매치하면 거짓) |
$word = 'apple';
if ($word =~ /a/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
정규식 표현은 보통 슬래시(/)로 감싼 부분이 패턴 매치 대상이 되지만,
이 슬래시를 다른 기호로도 사용할 수 있습니다.
패턴 안에 [슬래시]가 많이 포함된 경우에 정규식 표현을 보기 쉽게 하기 위해서라고 생각됩니다.
구문 | 내용 |
---|---|
m [기호] 패턴 [기호] | /패턴/ 과 동일 |
※기호로는 @, #, *, |, #, {}, [], ()등 사용가능
$url = 'http://www.local.com/';
if ($url =~ m|http://|) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
패턴 매치 연산자에는 정규식 표현을 처리할 때 사용 가능한 몇 개의 옵션이 있습니다.
옵션 | 내용 |
---|---|
g | 반복 매치 |
i | 대문자 소문자 구별 안 함 |
m | 문자열을 복수행으로 취급 |
o | 변수 출력을 1번만 사용 |
s | 문자열을 단일행으로 취급 |
x | 확장 정규식 표현을 사용 |
코드 예 -1 (i 옵션)
$word = 'apple';
if ($word =~ /A/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있지 않습니다.
$word = 'apple';
if ($word =~ /A/i) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
코드 예 -2 (m 옵션)
$word = "AAA\nBbb\n";
if ($word =~ /^B/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있지 않습니다.
$word = "AAA\nBbb\n";
if ($word =~ /^B/m) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
메타 문자
정규식 표현을 실행할 때 다음과 같은 메트 문자로 불리는 특수한 의미를 가진 문자는,
매치가 되지 않기 때문에 반드시 앞에 \를 부여해서 에스케이프 해줘야 합니다.
\ ^ . $ * ? | ( ) [ ] { }
메타 문자를 [문자]로써 매치하고 싶을 때는 메타 문자 앞에 \를 사용
$price = 'This is $100';
if ($price =~ /\$/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
에스케이프 안한 메타 문자는 정규식 표현 안에서 다음과 같은 동작을 합니다.
메타 문자 | 정규식 안에서의 의미 |
---|---|
\ | 바로 뒤의 문자를 에스케이프 |
^ | 맨 앞에 매치 |
$ | 맨 뒤에 매치 |
. | 개행 이외의 임의의 한문자 |
코드 예 -1(^ 사용예)
$word = 'apple';
if ($word =~ /^a/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
코드 예 -2(. 사용예)
$word = 'apple';
if ($word =~ /app.e/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
코드 예 -3($ 사용예)
$word = 'apple';
if ($word =~ /e$/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
패턴 논리화
메타 문자 | 정규식 안에서의 의미 |
---|---|
| | 선택 |
여러 개의 문자열을 파이프로 분할해서 사용하여 복수의 패턴을 검색할 수 있습니다.
$word = 'apple';
if ($word =~ /a|b|c/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
패턴 그룹
메타 문자 | 정규식 안에서의 의미 |
---|---|
() | 그룹화 |
여러 문자열을 모아둔 형태의 패턴 매치입니다.
그리고 패턴 그룹으로 매치된 문자열은 특정 변수($ + 숫자)로 매친된 순으로 대입할 수 있습니다.
$word = 'apple';
if ($word =~ /^(...)(.)(.)/) {
print "$1 \n";
print "$2 \n";
print "$3 \n";
}
결과
> app
> l
> e
문자 클래스
메타 문자 | 정규식 안에서의 의미 |
---|---|
[] | 지정 내의 임의 표현 |
매칭 대상이 되는 문자열 안에 []로 감싼 문자열 중의 하나를 매치하기 위한 표현입니다.
[]안의 맨 앞에 ^를 사용하면 반대의 의미인 포함하지 않는 문자에 매칭하게 됩니다.
그리고 []안에 -(마이너스 기호)를 사용하면 범위 지정을 의미합니다.
$word = 'apple';
if ($word =~ /[a-z]/) {
print "소문자가 포함되어 있습니다. \n";
} else {
print "소문자가 포함되어 있지 않습니다. \n";
}
결과
> 소문자가 포함되어 있습니다.
if ($word =~ /[0-9]/) {
print "숫자가 포함되어 있습니다. \n";
} else {
print "숫자가 포함되어 있지 않습니다. \n";
}
결과
> 숫자가 포함되어 있지 않습니다.
문자 클래스로 많이 사용하는 것으로 다음과 같은 것이 있습니다.
문자 클래스 | 의미 |
---|---|
[a-z] | 소문자가 있는지 확인 |
[A-Z] | 대문자가 있는지 확인 |
[0-9] | 숫자가 있는지 확인 |
[a-zA-Z0-9] | 영문자, 숫자가 있는지 확인 |
[^a-zA-Z] | 영문자가 없으면 매치 |
[^0-9] | 숫자가 없으면 매치 |
문자 반복
메타 문자 | 정규식 안에서의 의미 |
---|---|
* | 바로 앞의 문자를 0회 이상 매치 |
+ | 바로 앞의 문자를 1회 이상 매치 |
? | 바로 앞의 문자를 0회 또는 1회 매치 |
{n} | 바로 앞의 문자를 n회 매치 |
{n,} | 바로 앞의 문자를 n회 이상 매치 |
{n,m} | 바로 앞의 문자를 n회 이상, m회 이하 매치 |
{} 사용예
$word = 'apple';
if ($word =~ /[a-z]{5}/) {
print "포함되어 있습니다.";
} else {
print "포함되어 있지 않습니다.";
}
결과
> 포함되어 있습니다.
문자 반복의 정규식 표현을 처리하는 경우, 매치하는 범위는 최대치인 것에 주의해야 됩니다.
다음의 예를 보겠습니다.
코드 예 -1
$word = 'apple:1 banana:3 orange:2';
if ($word =~ /(.+[0-9])/) {
print "$1\n";
}
결과
> apple:1 banana:3 orange:2
위의 예는 [숫자 앞에 1개 이상의 무언가의 문자열]이 있는 경우 매치됩니다.
이 경우 변수 $word의 문자열은 모두 매치되어 버립니다.
변수의 맨 끝 숫자 2 앞에 1개 이상의 문자열이 있기 때문에입니다.
[숫자 앞에 1개 이상의 무언가의 문자열]이라는 조건이라면,
「apple:1」이나「apple:1 banana:3」이라는 문자열에도 매치가 해당되지만,
위처럼 최대치 범위 안에서 조건에 해당하는 부분이 매치하는 것으로 결정되어 있습니다.
그래서 최소치 매치를 하기 위해서는 ?(퀘스천)옵션을 설정해줘야 합니다.
코드 예 -2
$word = 'apple:1 banana:3 orange:2';
if ($word =~ /(.+?[0-9])/) {
print "$1\n";
}
결과
> apple:1
그 외의 메타 문자 및 특정 변수
표현 | 정규식 안에서의 의미 |
---|---|
\w | 영문자, 숫자, 언더바. [a-zA-Z0-9_] 와 같음. |
\W | 영문자, 숫자, 언더바 이외의 문자. [^a-zA-Z0-9_] 와 같음. |
\d | 숫자. [0-9] 와 같음. |
\D | 숫자 이외의 문자. [^0-9] 와 같음. |
\t | 탭 |
\r | 리턴(복귀 문자) |
\n | 개행(줄바꿈) |
\f | 개행 페이지 |
\s | 스페이스. [\r\t\n\f] 와 같음. |
\S | 스페이스 이외의 문자. [^\r\t\n\f] 와 같음. |
\a | 알람 |
\b | 백스페이스 |
\e | 에스케이프 |
\0 + 숫자 | 8진법으로 표현한 ASCII문자. ( ex. \033, \040 등 ) |
\x + 영숫자 | 16진법으로 표현한 ASCII문자. ( ex. \x1b, \x00 등 ) |
\c[ | 컨트롤 문자 |
\l | 다음의 1문자를 소문자로 |
\u | 다음의 1문자를 대문자로 |
\L | \E까지의 문자열을 소문자로 |
\U | \E까지의 문자열을 대문자로 |
\E | 변경의 끝 |
\Q | \E까지의 문자열로 정규식 표현의 메타문자를 문자로 고침 |
\b | 단어의 경계에 매치 |
\B | 단어의 경계 이외에 매치 |
\A | 문자열의 처음에 매치. 메타문자 ^ 와 같음. |
\Z | 문자열의 마지막에 매치. 메타문자 $ 와 같음. |
$ + 숫자 | 그룹화한 패턴을 참조. ( ex. $1, $2, $3, … ) |
\ + 숫자 | 위와 같음. ( ex. \1, \2, \3, … ) |
$& | 매치한 문자열 전체 |
$` | 매치한 문자열 앞에 있는 모든 문자열 |
$’ | 매치한 문자열 뒤에 있는 모든 문자열 |
치환 연산자
정규식 표현을 사용해서 매치되는 문자열을 치환하는 치환 연산자가 있습니다.
구문 | 내용 |
---|---|
s/패턴/치환 문자열/ | [패턴]에 매치되는 문자열을 [치환 문자열]으로 변환 |
$word = "This is a pen.";
$word =~ s/pen/book/;
print "$word\n";
결과
> This is a book.
패턴을 감싼 슬래시 기호를 임의의 기호로 변경할 수 있습니다.
※ @, #, *, | 등
$url = 'http://www.local.com/bbs/file/';
$url =~ s|bbs/file|data/result|;
print "$url\n";
결과
> http://www.local.com/data/result/
치환 연산자를 실행할 때 다음과 옵션을 사용할 수 있습니다.
옵션 | 내용 |
---|---|
g | 반복 매치 |
i | 대문자 소문자 구별 안 함 |
m | 문자열을 복수행으로 취급 |
o | 변수 출력을 1번만 사용 |
s | 문자열을 단일행으로 취급 |
x | 확장 정규식 표현을 사용 |
e | 치환 문자열을 [식]으로 사용 |
코드 예 -1(g 옵션)
$word = 'aaaa';
$word =~ s/a/A/;
print "$word\n";
결과
> Aaaa
$word = 'aaaa';
$word =~ s/a/A/g;
print "$word\n";
결과
> AAAA
코드 예 -2(e 옵션)
$word = "this is 100 won.";
$word =~ s/(\d+)/$1 * 2/e;
print "$word\n";
결과
> this is 200 won.
변환 연산자
변환 연산자는 문자열을 1문자 씩 순선대로 스캔해서 대상 문자열에 포함되는 모든 문자열을 변환하고 변환한 문자 수를 반환합니다.
변환 연산자는 정규식 표현을 사용하지 않기 때문에, 정규식 표현 대상이 되지 않는 연산자이기도 합니다.
구문 | 내용 |
---|---|
tr/변환 대상 문자/변환 후 문자/ | 「변환 대상 문자」를 스캔해서 「변환 후 문자」로 변환 |
y/변환 대상 문자/변환 후 문자/ | 위와 동일 |
코드 예 -1(대문자 변환)
$word = 'apple';
$word =~ tr/a-z/A-Z/;
print "$word\n";
결과
> APPLE
코드 예 -2(변환한 문자 개수를 취득)
$word = 'apple';
$count = $word =~ tr/a-z/A-Z/;
print "$count\n";
결과
> 5
변환 연산자에는 다음과 같은 옵션이 있습니다.
옵션 | 내용 |
---|---|
c | 대상 문자에 포함되지 않는 문자를 변환 |
d | 변환 후 문자에 포함되지 않는 문자를 삭제 |
s | 변환 결과 같은 문자가 연속되는 문자를 하나의 문자로 변환 |
코드 예 -1(c 옵션)
$word = 'American Coffee';
$word =~ tr/A-Z/_/c; # 대문자 이외의 문자를 _로 변환
print "$word\n";
결과
> A________C_____
코드 예 -2(d 옵션)
$word = 'American Coffee';
$word =~ tr/a-z//d; # 소문자 삭제
print "$word\n";
결과
> A C
코드 예 -3(s 옵션)
$word = 'apple';
$word =~ tr/a-z/A-Z/s; # 대문자로 변환하고 연속되는 같은 문자를 하나의 문자로 변환
print "$word\n";
결과
> APLE
정규식 표현을 이용하는 함수
정규식 표현을 이용하는 함수로 split함수가 있습니다.
그리고 split함수의 반대 기능으로 join함수가 있습니다. (join함수는 정규식 표현을 사용 안 합니다.)
코드 예 -1(split 함수)
$word = "apple:banana:orange";
@word = split(/:/, $word); # : 를 구분으로 [문자열]을 [배열]로 저장
print "@word\n";
결과
> apple banana orange
코드 예 -2(join 함수)
@word = ("apple", "banana", "orange");
$word = join(":", @word); # : 를 구분으로 [배열]을 [문자열]로 저장
print "$word\n";
결과
> apple:banana:orange
댓글