
최근에 문자열 "//;\n1;2;3" 같은 입력을 처리하면서,
커스텀 구분자와 숫자 부분을 분리해야 하는 상황이 있었습니다.
이 글에서는 정규표현식으로 그 문제를 해결하는 방법을 정리해봤습니다.
문자열 "//;\n1;2;3" 에서 다음 두 가지를 처리해야 합니다.
//(아무문자 0개 이상)\n 으로 시작하는지 검사// 와 \n 사이의 구분자(; 등) 와, 그 뒤의 숫자 문자열(1;2;3) 을 추출const str = "//;\n1;2;3";
const pattern = /^\/\/.*\n/;
console.log(pattern.test(str)); // true
^ : 문자열의 시작 \/\/ : 슬래시 두 개 (정규식 안에서는 //를 이스케이프해야 함) .* : 줄바꿈 전까지 아무 문자 0개 이상 \n : 줄바꿈 문자 👉 문자열이 //로 시작하고 줄바꿈(\n)으로 끝나는 첫 줄인지 검사할 수 있습니다.
const str = "//;\n1;2;3";
const re = /^\/\/(?<delimiter>.*)\n(?<numbers>[\s\S]*)$/;
const match = str.match(re);
/*
match는 이렇게 나옵니다.
1. 매칭 실패시 => null
2. 매칭 성공시 =>
[
"//;\n1;2;3", // 전체 매칭 결과
";", // 첫 번째 캡처 그룹
"1;2;3", // 두 번째 캡처 그룹
groups: { delimiter: ";", numbers: "1;2;3" },
index: 0, // 매칭 시작 인덱스
input: "//;\n1;2;3" // 원본 문자열
]
*/
if (match) {
console.log("delimiter:", match.groups.delimiter); // ';'
console.log("numbers:", match.groups.numbers); // '1;2;3'
}
| 부분 | 의미 |
|---|---|
^\/\/ | 문자열이 //로 시작 |
(?<delimiter>.*) | \n 이전까지의 구분자 (0개 이상 문자) |
\n | 줄바꿈 문자 |
(?<numbers>[\s\S]*) | 줄바꿈 뒤의 나머지 모든 문자 |
$ | 문자열의 끝 |
(?<delimiter>.*) — 구분자 부분(?<name>...) 은 이름 붙은 캡처 그룹.* 은 “아무 문자 0개 이상” (줄바꿈 제외)// 다음 줄바꿈(\n) 전까지의 내용을 구분자로 추출예:
"//;\n1;2;3"→delimiter = ";"
(?<numbers>[\s\S]*) — 숫자 부분[\s\S] 는 모든 문자를 의미 (줄바꿈 포함)* 은 0번 이상 반복예:
"//;\n1;2;3"→numbers = "1;2;3"
이 정규식 하나로 다음을 동시에 처리할 수 있습니다:
^\/\/(?<delimiter>.*)\n(?<numbers>[\s\S]*)$
✔️ 문자열이 //로 시작하고 줄바꿈으로 구분되는 구조인지 확인
✔️ 구분자와 실제 데이터(숫자 문자열) 모두 추출 가능
function parseCustomInput(str) {
const re = /^\/\/(?<delimiter>.*)\n(?<numbers>[\s\S]*)$/;
const m = str.match(re);
if (!m) return null;
return {
delimiter: m.groups.delimiter,
numbers: m.groups.numbers
};
}
console.log(parseCustomInput("//;\n1;2;3"));
// 👉 { delimiter: ';', numbers: '1;2;3' }
이번에 정규표현식을 사용하면서,
문자열이 특정한 규칙을 만족하는지
간단하게 테스트하고 처리할 수 있다는 점이
정말 강력하다고 느꼈습니다.
다만 정규표현식에는 규칙이 많고,
지금은 암호처럼 느껴지지만 😅
패턴 하나하나의 의미를 정확히 이해하고 나면
복잡한 문자열도 훨씬 쉽게 다룰 수 있을 것 같습니다.
그래서 앞으로 더 다양한 예제를 통해 연습하면서,
정규표현식을 자신 있게 사용할 수 있도록 해야겠다고 생각했습니다.