정규 표현식으로 문자열 제한하기

정규 표현식(Regular Expression)을 이용해서 문자열을 제한하는 규칙을 만드는 방법을 포스팅합니다.

먼저, 문자열을 제한하는 규칙을 수립해 봅시다.

  • 사용할 수 있는 문자는 숫자(0-9), 기본 라틴 알파벳(A-Z, a-z), 하이픈(-)과 언더바(_)로 제한.
  • 첫 번째 글자는 기본 라틴 알파벳(A-Z, a-z)으로 제한.

정규 표현식을 가지고 이 두 가지 규칙을 정하기 위한 프로그램을 만들어 봅시다.

다음은 정규 표현식으로 위의 규칙을 구현하기 위한 의사코드입니다.

Data "Abc123", "xyzABC", "123abc", "A_BCD",
     "_abcd", "ABC-DEF", "ABCD!", "ab cde"

Read Data to strs

Foreach strs to strval
	chks = RegExp("/[a-zA-Z]+[0-9a-zA-Z\-_]*/", strval)
	If chks[0] == strval
		Print strval " is valid."
	Else
		Print strval " is invalid."
	End if
End foreach

여기서 7번 줄이 위의 규칙에 해당하는 정규 표현식입니다.

  1. [a-zA-Z]+: 사각괄호 안에 있는 a-zA-Z는 a부터 z까지, 그리고 A부터 Z까지의 범위 안에 있는 문자열을 의미하고, 사각괄호 뒤의 + 표시는 그 조건에 해당하는 문자열이 적어도 하나는 있어야 함을 의미합니다.
  2. [0-9a-zA-Z\-_]*: 위의 1번에서 0-9, \-, _ 이렇게 세 가지가 추가되었습니다. 0-9는 숫자에 해당하는 문자열을 의미하고, _는 언더바를 의미합니다. 하이픈(-) 앞에 백슬래시(\)를 붙이는 이유는 하이픈이 범위 지정 기호로 쓰이기 때문에 이스케이프 처리를 해서 범위 지정 기호가 아닌 별개의 문자로 처리하게끔 하는 것입니다. 그리고 사각괄호 뒤의 * 표시는 위의 1번에 쓰인 + 표시와 비슷하지만 그 조건에 해당하는 문자열이 없더라도 조건에 맞는 것으로 처리된다는 차이가 있습니다.

만약 위의 의사코드를 토대로 프로그램을 작성한다면, 다음과 같은 결과가 나올 것입니다.

Abc123 is valid.
xyzABC is valid.
123abc is invalid.
A_BCD is valid.
_abcd is invalid.
ABC-DEF is valid.
ABCD! is invalid.
ab cde is invalid.

세번째와 다섯번째는 라틴 알파벳으로 시작하지 않았기 때문에 위의 1번 규칙을 위반, 일곱번째와 여덟번째는 특수문자를 사용했기 때문에 2번 규칙을 위반한 것입니다.
네번째와 여섯번째는 특수문자를 사용했지만 예외적으로 허용되는 하이픈(-)과 언더바(_)이기 때문에 규칙 통과입니다.

위의 의사코드를 실행 가능한 코드로 고치면 다음과 같습니다.

PHP:

<pre><?php
$strdata = ['Abc123', 'xyzABC', '123abc', 'A_BCD', '_abcd', 'ABC-DEF', 'ABCD!', 'ab cde'];
foreach ($strdata as $strval) {
    preg_match('/[a-zA-Z]+[0-9a-zA-Z\-_]*/', $strval, $chks);
    if ($chks[0] == $strval) {
        echo $strval . " is valid.\n";
    } else {
        echo $strval . " is invalid.\n";
    }
}
?></pre>

파이썬:

import re
strdata = ['Abc123', 'xyzABC', '123abc', 'A_BCD', '_abcd', 'ABC-DEF', 'ABCD!', 'ab cde']
for strval in strdata:
    chks = re.search(r'[a-zA-Z]+[0-9a-zA-Z\-_]*', strval)
    if chks.group(0) == strval:
        print("%s is valid." % strval)
    else:
        print("%s is invalid." % strval)

두 코드 모두 결과는 위의 가상 결과와 같습니다.

이외의 다른 언어도 정규 표현식을 지원한다면 위와 같이 구현할 수 있습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다