๋ฐ˜์‘ํ˜•

 

์ •๊ทœํ‘œํ˜„์‹(Regular Expression, ์ค„์—ฌ์„œ RegEx)์€ ๋ฌธ์ž์—ด์—์„œ ํŠน์ • ํŒจํ„ด์„ ์ฐพ๊ฑฐ๋‚˜ ๋งค์นญํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋ฌธ์ž์—ด ํŒŒ์‹ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •๊ทœํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•
const regex = /pattern/;

// RegExp ๊ฐ์ฒด ์ƒ์„ฑ์ž
const regex = new RegExp("pattern");

 

๊ธฐ๋ณธ ๋ฌธ๋ฒ•


๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž

์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋ฌธ์ž๋กœ, ๊ทธ๋Œ€๋กœ ๋งค์นญ๋ฉ๋‹ˆ๋‹ค.

const regex = /Yundogi/;
regex.test("Yundogi Dev"); // true

 

๋ฉ”ํƒ€ ๋ฌธ์ž

ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ๋ฌธ์ž๋“ค์ž…๋‹ˆ๋‹ค.

  • . : ์ž„์˜์˜ ํ•œ ๋ฌธ์ž
  • ^ : ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘
  • $ : ๋ฌธ์ž์—ด์˜ ๋
  • ** : 0ํšŒ ์ด์ƒ ๋ฐ˜๋ณต
  • + : 1ํšŒ ์ด์ƒ ๋ฐ˜๋ณต
  • ? : 0ํšŒ ๋˜๋Š” 1ํšŒ
  • \ : ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž
const regex = /^y.ndogi$/;
regex.test("yundogi"); // true
regex.test("yondogi"); // true
regex.test("yundogi hi"); // false

const regex2 = /^y.*i$/;
regex.test("yundogi hi"); // true

 

๋ฌธ์ž

๋Œ€๊ด„ํ˜ธ []๋กœ ๋ฌถ์–ด ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • [abc\] : a, b, c ์ค‘ ํ•˜๋‚˜์™€ ๋งค์นญ
  • [^abc\] : a, b, c๋ฅผ ์ œ์™ธํ•œ ๋ฌธ์ž์™€ ๋งค์นญ
  • [a-z\] : a๋ถ€ํ„ฐ z๊นŒ์ง€์˜ ์†Œ๋ฌธ์ž์™€ ๋งค์นญ
  • [A-Z\] : A๋ถ€ํ„ฐ Z๊นŒ์ง€์˜ ๋Œ€๋ฌธ์ž์™€ ๋งค์นญ
  • [0-9\] : 0๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž์™€ ๋งค์นญ
const regex = /[aeiou]/;
regex.test("yundogi"); // true
regex.test("sky"); // false

 

์•ฝ์–ด ๋ฌธ์ž

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž ํด๋ž˜์Šค์— ๋Œ€ํ•œ ์•ฝ์–ด์ž…๋‹ˆ๋‹ค.

  • \d : ์ˆซ์ž ([0-9]์™€ ๋™์ผ)
  • \D : ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž ([^0-9]์™€ ๋™์ผ)
  • \w : ๋‹จ์–ด ๋ฌธ์ž ([A-Za-z0-9_]์™€ ๋™์ผ)
  • \W : ๋‹จ์–ด ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž
  • \s : ๊ณต๋ฐฑ ๋ฌธ์ž (์ŠคํŽ˜์ด์Šค, ํƒญ, ์ค„๋ฐ”๊ฟˆ ๋“ฑ)
  • \S : ๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž
const regex = /\d{3}-\d{3}-\d{4}/;
regex.test("123-456-7890"); // true
regex.test("abc-def-ghij"); // false

 

ํ”Œ๋ž˜๊ทธ


์ •๊ทœ์‹์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ˆ˜์ •ํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋“ค์€ ์ •๊ทœ์‹ ๋ฆฌํ„ฐ๋Ÿด์˜ ๋์ด๋‚˜ RegExp ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const regex = /yundogi/gi;
// or
const regex = new RegExp('yundogi', 'gi');
์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • g (global): ์ „์—ญ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ํ›„์—๋„ ๊ณ„์†ํ•ด์„œ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • i (ignore case): ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • m (multiline): ์—ฌ๋Ÿฌ ์ค„ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. ^์™€ $๊ฐ€ ๊ฐ ์ค„์˜ ์‹œ์ž‘๊ณผ ๋์— ๋งค์นญ๋ฉ๋‹ˆ๋‹ค.
  • s (dotAll): ์ด ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋ฌธ์ž์™€ ๋งค์นญ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • u (unicode): ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ์˜ ์‹œํ€€์Šค๋กœ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • y (sticky): "sticky" ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์˜ ํ˜„์žฌ ์œ„์น˜์—์„œ๋ถ€ํ„ฐ๋งŒ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
// ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ „์—ญ ๊ฒ€์ƒ‰
const regex1 = /hello/gi;
"Hello, hello, HELLO".match(regex1); // ["Hello", "hello", "HELLO"]

// ์—ฌ๋Ÿฌ ์ค„ ๋ชจ๋“œ์—์„œ ๊ฐ ์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„ ๊ฒ€์ƒ‰
const regex2 = /^start/gm;
"start of line 1\nstart of line 2".match(regex2); // ["start", "start"]

// ์œ ๋‹ˆ์ฝ”๋“œ ์ด๋ชจ์ง€ ๊ฒ€์ƒ‰
const regex3 = /\p{Emoji}/gu;
"I love coffee โ˜•".match(regex3); // ["โ˜•"]

 

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด


์ด๋ฉ”์ผ ์ฃผ์†Œ

const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
emailRegex.test("user@example.com"); // true

URL

const urlRegex = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
urlRegex.test("https://www.example.com"); // true

๋‚ ์งœ ํ˜•์‹ (YYYY-MM-DD)

const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
dateRegex.test("2024-03-15"); // true

 

๋ฉ”์†Œ๋“œ


  • test(): ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ (boolean ๋ฐ˜ํ™˜)
  • exec(): ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฐพ์•„ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • match(): ๋ฌธ์ž์—ด ๋ฉ”์†Œ๋“œ, ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • replace(): ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด๋กœ ๊ต์ฒด
  • search(): ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜
const text = "Hello, my number is 123-456-7890.";
const phoneRegex = /\d{3}-\d{3}-\d{4}/;

phoneRegex.test(text); // true
phoneRegex.exec(text); // ["123-456-7890", index: 24, input: "Hello, my number is 123-456-7890.", groups: undefined]
text.match(phoneRegex); // ["123-456-7890"]
text.replace(phoneRegex, "XXX-XXX-XXXX"); // "Hello, my number is XXX-XXX-XXXX."
text.search(phoneRegex); // 24

 

๊ณ ๊ธ‰ ๊ธฐ๋ฒ•


๊ทธ๋ฃน๊ณผ ์บก์ฒ˜

๊ด„ํ˜ธ ()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃน์„ ๋งŒ๋“ค๊ณ  ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const regex = /(\d{3})-(\d{3})-(\d{4})/;
const match = regex.exec("My number is 123-456-7890");
console.log(match[1]); // "123"
console.log(match[2]); // "456"
console.log(match[3]); // "7890"

 

๋ฐฑ๋ ˆํผ๋Ÿฐ์Šค

์บก์ฒ˜๋œ ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const regex = /(\w+)\s+\1/;
regex.test("hello hello"); // true
regex.test("hello world"); // false

 

ํƒ์ƒ‰

ํŒจํ„ด์„ ๋งค์น˜ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๊ธ์ • ์ „๋ฐฉํƒ์ƒ‰: (?=...)
  • ๋ถ€์ • ์ „๋ฐฉํƒ์ƒ‰: (?!...)
  • ๊ธ์ • ํ›„๋ฐฉํƒ์ƒ‰: (?<=...)
  • ๋ถ€์ • ํ›„๋ฐฉํƒ์ƒ‰: (?<!...)
const regex = /\d+(?=์›)/;
console.log("5000์›".match(regex)); // ["5000"]

const negativeRegex = /\d+(?!์›)/;
console.log("5000๋‹ฌ๋Ÿฌ".match(negativeRegex)); // ["5000"]

 

์˜ˆ์ œ


๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณต์žก์„ฑ ๊ฒ€์ฆ

function validatePassword(password) {
    const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/;
    return regex.test(password);
}

console.log(validatePassword("Abcd1234!")); // true
console.log(validatePassword("password123")); // false

 

HTML ํƒœ๊ทธ ์ œ๊ฑฐ

function stripHTMLTags(html) {
    return html.replace(/<[^>]*>/g, '');
}

const html = "<p>Hello <strong>World</strong>!</p>";
console.log(stripHTMLTags(html)); // "Hello World!"

 

CSV ํŒŒ์‹ฑ

function parseCSV(csv) {
    const rows = csv.split('\n');
    return rows.map(row => {
        return row.match(/(".*?"|[^",]+)(?=\s*,|\s*$)/g).map(cell => {
            return cell.replace(/^"(.*)"$/, '$1');
        });
    });
}

const csv = `"Name","Age","City"
"John Doe",30,"New York"
"Jane Smith",25,"Los Angeles"`;

console.log(parseCSV(csv));
๋ฐ˜์‘ํ˜•
์œค๋„๊ธฐ