JavaScript 정규 표현식과 RegExp 객체

안녕하세요, 열정적인 프로그래머 여러분! 오늘 우리는 JavaScript에서 정규 표현식(RegEx)의 세계로 흥미로운 여정을 떠납니다. RegEx에 대해 들어본 적이 없으신 걱정 마세요 - 우리는 기본부터 시작해 차근차근 올라갈 것입니다. 이 튜토리얼의 끝까지 배우시면, 마치 프로처럼 RegEx의 힘을 사용하실 수 있을 것입니다!

JavaScript - RegExp

정규 표현식이란?

정규 표현식(Regular Expressions, 약자 RegEx)은 문자열의 패턴 일치와 조작에 강력한 도구입니다. 이를 문자열을 설명하는 특별한 언어라고 생각해 보세요. 문자열을 다루는 데 있어 다용도이고 매우 유용한瑞士軍刀와 같은 존재입니다!

간단한 예제로 시작해 보겠습니다:

let pattern = /hello/;
let text = "Hello, world!";
console.log(pattern.test(text));  // 출력: false

이 예제에서 /hello/은 우리의 RegEx 패턴이며, "Hello, world!"라는 텍스트와 일치하는지 테스트하고 있습니다. 결과는 false입니다. 왜냐하면 RegEx는 기본적으로 대소문자를 구분하기 때문입니다.

RegExp 객체

JavaScript에서는 RegExp 객체를 사용하여 RegEx 패턴을 만들 수 있습니다. 다음은 그 방법입니다:

let pattern1 = new RegExp("hello");
let pattern2 = /hello/;

console.log(pattern1.test("hello world"));  // 출력: true
console.log(pattern2.test("hello world"));  // 출력: true

이 두 가지 방법으로 만든 RegExp 객체는 동일합니다. 리터럴 표기법(/pattern/)은 간단성 때문에 더 자주 사용됩니다.

수정자(Modifiers)

수정자는 RegEx 패턴의 동작을 변경할 수 있습니다. 몇 가지 흔한 수정자를 살펴보겠습니다:

수정자 설명
i 대소문자 구분하지 않음
g 전체 일치(첫 번째 일치 외에도 모든 일치 찾기)
m 다중 줄 일치

'이' 수정자를 사용한 예제입니다:

let pattern = /hello/i;
let text = "Hello, World!";
console.log(pattern.test(text));  // 출력: true

이제 우리의 패턴은 대소문자를 구분하지 않고 "Hello"를 일치시킵니다!

괄호(Brackets)

RegEx에서 괄호는 문자 집합이나 범위를 정의하는 데 사용됩니다:

괄호 설명
[abc] 괄호 안의 모든 문자 일치
[^abc] 괄호 안의 문자를 제외한 일치
[0-9] 0에서 9 사이의 모든 숫자 일치
[a-z] 소문자 a에서 z 사이의 모든 문자 일치

예제를 보겠습니다:

let pattern = /[aeiou]/;
console.log(pattern.test("hello"));  // 출력: true
console.log(pattern.test("why"));    // 출력: false

이 패턴은 모든 모음을 일치시킵니다. "hello"에서 일치하지만 "why"에서는 일치하지 않습니다.

횟수(Quantifiers)

횟수는 특정 문자, 그룹 또는 문자 클래스가 일치하기 위해서 필요한 인스턴스 수를 지정합니다.

횟수 설명
* 0번 이상의 발생 횟수
+ 1번 이상의 발생 횟수
? 0번 또는 1번의 발생 횟수
{n} 정확히 n번의 발생 횟수
{n,} n번 이상의 발생 횟수
{n,m} n번에서 m번 사이의 발생 횟수

재미있는 예제를 보겠습니다:

let pattern = /ba+/;
console.log(pattern.test("b"));      // 출력: false
console.log(pattern.test("ba"));     // 출력: true
console.log(pattern.test("baaaa"));  // 출력: true

이 패턴은 "ba" 뒤에 추가적인 "a"가 여러 개 있는지 일치시킵니다. 마치 양의 울음소리처럼 "baaaa"입니다!

리터럴 문자(Literal Characters)

RegEx에서 리터럴 문자는 그 자체를 일치시킵니다. 예를 들어, /hello/은 정확한 문자열 "hello"를 일치시킵니다.

let pattern = /hello world/;
console.log(pattern.test("hello world"));  // 출력: true
console.log(pattern.test("hello earth"));  // 출력: false

이 패턴은 정확한 문자열 "hello world"를 일치시킵니다.

메타 문자(Metacharacters)

메타 문자는 RegEx에서 특별한 의미를 가집니다:

메타 문자 설명
. 모든 단일 문자 일치
\d 모든 숫자 일치
\D 모든 비숫자 일치
\w 모든 단어 문자 일치
\W 모든 비단어 문자 일치
\s 모든 공백 문자 일치
\S 모든 비공백 문자 일치

메타 문자를 사용한 예제입니다:

let pattern = /\d{3}-\d{3}-\d{4}/;
console.log(pattern.test("123-456-7890"));  // 출력: true
console.log(pattern.test("abc-def-ghij"));  // 출력: false

이 패턴은 일반적인 미국 전화번호 형식을 일치시킵니다.

RegExp 속성

RegExp 객체는 몇 가지 유용한 속성을 가지고 있습니다:

속성 설명
global "g" 플래그가 설정되었는지 여부
ignoreCase "i" 플래그가 설정되었는지 여부
multiline "m" 플래그가 설정되었는지 여부
source 패턴의 텍스트
lastIndex 다음 일치를 시작할 인덱스

이 속성들을 사용하는 방법을 보겠습니다:

let pattern = /hello/gi;
console.log(pattern.global);      // 출력: true
console.log(pattern.ignoreCase);  // 출력: true
console.log(pattern.source);      // 출력: "hello"

RegExp 메서드

마지막으로, RegExp 객체를 사용할 수 있는 몇 가지 메서드를 살펴보겠습니다:

메서드 설명
exec() 문자열에서 일치를 실행
test() 문자열에서 일치를 테스트
toString() regexp의 문자열 표현

exec() 메서드를 사용한 예제입니다:

let pattern = /\d+/g;
let text = "I have 2 apples and 3 oranges.";
let match;

while ((match = pattern.exec(text)) !== null) {
console.log(`Found ${match[0]} at index ${match.index}`);
}

// 출력:
// Found 2 at index 7
// Found 3 at index 23

이 코드는 텍스트에서 모든 숫자를 찾아 그 위치를 보고합니다.

이제 JavaScript에서 정규 표현식의 기본을 다루었습니다. 연습이 완벽을 만듭니다. 자신만의 패턴을 만들어 테스트해 보세요. 얼마 지나지 않아 문자열 조작 문제를 쉽게 해결할 수 있는 정규 표현식을 사용하시게 될 것입니다!

행복하게 코딩하세요, 그리고 여러분의 정규 표현식이 항상 일치하길 바랍니다!

Credits: Image by storyset