๐ RegExp(์ ๊ทํํ์)์ ๊ฐ๋ ๊ณผ ์์ฉ ์์ ์ดํด๋ณด๊ธฐ
RegExp
๋ ์ ๊ทํํ์์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ๋ฌธ์์ด์ ๋์์ผ๋ก ํจํด ๋งค์นญ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํจํด ๋งค์นญ ๊ธฐ๋ฅ๊ณผ ํน์ ํจํด๊ณผ ์ผ์นํ๋ ๋ฌธ์์ด์ ๊ฒ์ํ๊ฑฐ๋ ์ถ์ถ ๋๋ ์นํํ ์ ์๋ ๊ธฐ๋ฅ์ ๋งํ๋ค. ์ฌ๋ฌ ๋ฐฉ๋ฉด์์๋ ์ฌ์ฉ๋์ง๋ง ๋ณดํต ๊ธ์ด์ด๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๊ฑฐ๋ ํ๋ก์ ํธ ์ util
๊ด๋ จ ํจ์๋ฅผ ๋ง๋ค ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์ ๊ทํํ์์ ์ฅ์ ์ ๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ ์์ด ํจํด์ ์ ์ํ๊ณ ํ
์คํธํ๋ ๊ฒ์ผ๋ก ๊ฐ๋จํ ์ฒดํฌํ ์ ์๋ค. ํ์ง๋ง, ์ฌ๋ฌ ๊ฐ์ง ๊ธฐํธ๋ฅผ ํผํฉํ์ฌ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฒ์ ์ ํ๋ค๋ฉด ๊ฐ๋
์ฑ์ด ๋งค์ฐ ์ข์ง ๋ชปํ ๋จ์ ์ด ์๋ค. ์ ๊ทํํ์์๋ ๋ค์ํ ํจํด์ด ์์ง๋ง ๊ทธ์ค ๋ํ์ ์ผ๋ก ์ฐ์ด๋ ๊ฒ๋ค๋ง ์์๋ณด์.
๋ณธ๋ก ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ ๊ท ํํ์์ ๊ฒ์ ๋ฐฉ์์ ์ค์ ํ๋ ํ๋๊ทธ๊ฐ ์๋๋ฐ, ์ด 6๊ฐ์ ํ๋๊ทธ๊ฐ ์๋ค. ํ๋๊ทธ๋ ์ฌ๋ฌ ๊ฐ ๋ฃ์ ์ ์์ผ๋ฉฐ, ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ฌ ํจํด์ ๊ฒ์ํ๋ค. ๋ํ ๊ฒ์ ๋งค์นญ ๋์์ด ์ฌ๋ฌ ๊ฐ์ฌ๋ ์ฒซ ๋ฒ์งธ ๋งค์นญ ๋์๋ง ๊ฒ์ํ๊ณ ์ข
๋ฃํ๋ค.(์ฌ๋ฌ ๊ฐ์ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ค๋ฉด g
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.)
1. g(global): ํจํด๊ณผ ์ผ์นํ๋ ๋ชจ๋ ๊ฐ๋ค์ ์ ์ญ ๊ฒ์ํ๋ค. (๋ฐ์ฑ๋ฌธ์ ์์ด๋ก ํด์ํ ๊ฒ์ด ์๋ ๐)
2. i(ignoreCase): ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ณ ํจํด์ ๊ฒ์ํ๋ค.
3. m(multiLine): ๋ฌธ์์ด์ ํ์ด ๋ฐ๋๋๋ผ๋ ํจํด ๊ฒ์์ ์ง์ํ๋ค.
4. s(source): ๊ฐํ ๋ฌธ์์ธ `\n`๋ ํฌํจํ๋๋ก ํ์ฑํ ํ๋ค.
5. u(unicode): ์ ๋์ฝ๋ ์ ์ฒด๋ฅผ ์ง์ํ๋ค.
6. y(sticky): ๋ฌธ์ ๋ด ํน์ ์์น์์ ๊ฒ์์ ์งํํ๋ `sticky` ๋ชจ๋๋ฅผ ํ์ฑํ ์ํจ๋ค.
ํ๋๋ง ๋ ์์๋ณด์. ๋ฐ๋ก ํจํด์ธ๋ฐ, ํ๋๊ทธ๋ ์ ๊ท ํํ์์ ๊ฒ์ ๋ฐฉ์์ ์ค์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค๋ฉด, ์ ๊ทํํ์์ ํจํด์ ๋ฌธ์์ด์ ์ผ์ ํ ๊ท์น์ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ํจํด์ ๋ฌธ์์ด์ ๋ฐ์ดํ ๋์ /
๋ก ์ด๊ณ ๋ซ๋๋ค. ์ฆ, "Hello"
๊ฐ ์๋๋ผ /Hello/
๋ก ์ฒ๋ผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ง์ฝ, ๋ฐ์ดํ๋ฅผ ํฌํจํ๋ค๋ฉด ๋ฐ์ดํ๊น์ง๋ ํจํด์ ํฌํจ๋๋ ์ด ์ ์ ์ฃผ์ํ์. ํจํด์ ์ข
๋ฅ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฌ ๊ฐ ์์ง๋ง ์ฃผ๋ก ์ฌ์ฉํ๋ ํจํด์ ๋ค์๊ณผ ๊ฐ๋ค.
[ ]
: ๊ดํธ์์ ์๋ ๊ฐ์or
์ ๋ํ๋\d
: [ 0-9 ]๋ฅผ ์๋ฏธํจ\D
: ์ซ์๊ฐ ์๋ ๋ฌธ์๋ฅผ ์๋ฏธํจ\w
: ์ํ๋ฒณ, ์ซ์, ์ธ๋์ค์ฝ์ด๋ฅผ ์๋ฏธํจ([ A-Za-z0-9 ]
)\W
: ์ํ๋ฒณ, ์ซ์, ์ธ๋์ค์ฝ์ด๊ฐ ์๋ ๋ฌธ์๋ฅผ ์๋ฏธํจ/s
: ์ฌ๋ฌ ๊ฐ์ง ๊ณต๋ฐฑ ๋ฌธ์(์คํ์ด์ค, ํ ๋ฑ)๋ฅผ ์๋ฏธํ๋ค.[/t/r/n/v/f]
์ ๊ฐ์ ์๋ฏธ๋ค.*
: ์ด์ ํญ๋ชฉ์ 0๋ฒ ์ด์ ๋ฐ๋ณตํจ+
: ์ด์ ํญ๋ชฉ์ 1ํ ์ด์ ๋ฐ๋ณตํจ^
:[ ]
๋ด๋ถ์ ์๋^
๋not
์ ์๋ฏธํ๊ณ ,[ ]
์ธ๋ถ์ ์๋^
๋ ๋ฌธ์์ด์ ์์์ ์๋ฏธํ๋ค.$
: ๋ฌธ์์ด์ ๋ง์ง๋ง์ ์๋ฏธํ๋ค.?
: ์์ ํจํด์ด ์ต๋ ํ ๋ฒ ์ด์(0๋ฒ ํฌํจ) ๋ฐ๋ณต๋๋์ง๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ์์ ํจํด (s
)์ด ์๊ฑฐ๋ ์์ด๋ ๋งค์น๋๋ค.{m,n}
: ๋ฐ๋ณต ๊ฒ์ ํจํด์ผ๋ก ์ต์m
๋ฒ, ์ต๋n
๋ฒ ๋ฐ๋ณต๋๋ ๋ฌธ์์ด์ ์๋ฏธํ๋ค. ์ฝค๋ง ๋ค์ ๊ณต๋ฐฑ์ด ์ค์ง ์๊ฒ ์ฃผ์ํ์.
์, ์ด์ ํ๋๊ทธ์ ํจํด์ ๋ํด์ ์์๋ดค์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก RegExp
๋ฉ์๋์ ๋ํด ์์๋ณด์. MDN์ ์ ํ์๋ฏ์ด ๋ฉ์๋๋ ์ฌ๋ฌ ๊ฐ ์์ง๋ง, ์ฌ๊ธฐ์๋ exec
, match
, test
์ ๋๋ง ์์๋ณด์.
exec
: ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค. ๋งค์นญ ๊ฒฐ๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐnull
๋ก ๋ฐํํ๋ค. ํน์ด์ฌํญ์ผ๋ก๋g
ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ฒซ ๋ฒ์งธ ๋งค์นญ ๊ฒฐ๊ณผ๋ง ๋ฐํํ๋ค.
let target = "is";
let str = "what is your name? my name is ywtechit";
console.log(/is/g.exec(target));
๐๐ฝ [ 'is', index: 0, input: 'is', groups: undefined ]
match
: ์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ํด ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.exec
๋ฉ์๋์๋ ๋ค๋ฅด๊ฒg
ํ๋๊ทธ๋ฅผ ์ง์ ํ๋ฉด ๋ชจ๋ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ค.
// ex1: ๋ฌธ์ 'p'์ ๊ฐ์๋ฅผ return ํ์์ค
let lyrics = "i have a pen pineapple apple pen";
let reg = lyrics.match(/p/g) // [ 'p', 'p', 'p', 'p', 'p', 'p', 'p' ]
console.log(reg.length)
๐๐ฝ 7 // ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ๊ณง `p`์ ๊ฐ์์ ๋์ผํ๋ค.
let target = "what is your name? my name is ywtechit";
// ex2: is ๊ฐ์ ํ๋ฒ๋ง ์ฐพ๊ธฐ
console.log(target.match(/is/));
๐๐ฝ [ 'is', index: 5, input: 'what is your name? my name is ywtechit', groups: undefined ]
// ex3: is ๊ฐ์ ๋ชจ๋ ์ฐพ๊ธฐ
console.log(target.match(/is/g));
๐๐ฝ [ 'is', 'is' ]
// ex4: A๊ฐ 2๋ฒ์ด์ ๋ฐ๋ณตํ๋ ๋ฌธ์์ด์ ๋ฐํํ๊ธฐ
const target = "A AA B BB Aa Bb AAA";
const regExp = /A{2,}/g;
const result = target.match(regExp)
console.log('result :>> ', result); // [ "AA", "AAA" ]
// ex5: URL ์ ์ผ ๋ง์ง๋ง ๊ฐ๋ง ์ถ์ถํ๋ ์ ๊ทํํ์
const url = "https://swtrack.elice.io/courses/16306/lecturerooms/16157";
const reg = url.match(/\/([0-9]+)$/);
console.log(reg);
๐๐ฝ
[
0: '/16157',
1: '16157',
2: index: 51,
3: input: 'https://swtrack.elice.io/courses/16306/lecturerooms/16157',
4: groups: undefined
]
// ex6: URL์ ํฌํจ๋ ํน์ ๋ฌธ์ ๋ถ๋ฆฌํ๊ธฐ
let reg = s.match(/\/(lecturerooms)\/([0-9]+$)/);
console.log(reg);
๐๐ฝ
[
0: "/lecturerooms/16157"
1: "lecturerooms"
2: "16157"
groups: undefined
index: 38
input: "https://swtrack.elice.io/courses/16306/lecturerooms/16157"
length: 3
]
// ex7: ๋ฌธ์์ ๋ด์ฉ๊ณผ ์๊ด์์ด 3์๋ฆฌ ๋ฌธ์์ด๊ณผ ๋งค์นํ๊ธฐ
let target = "Is this your mac? Is this your phone?";
console.log(target.match(/.../g));
๐๐ฝ
[
'Is ', 'thi', 's y',
'our', ' ma', 'c? ',
'Is ', 'thi', 's y',
'our', ' ph', 'one'
]
test
: ๋งค์นญ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ฆฌ์ธ(boolean)๊ฐ์ผ๋ก ๋ฐํํ๋ค. ์ง๊ธ๊น์ง ์ด ๋ฉ์๋๋ฅผ ์ ์ผ ๋ง์ด ์ฌ์ฉํ๋ค. ์ฌ๋ด์ผ๋ก ์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ ํ์์ธ์ง ๊ฒ์ฌํ๋ ๊ณต์ ํจํด(FC 5322 Official Standard)์ emailregex.com์์๋ ํ์ธ ํ ์ ์๋ค.
// ex1: ํด๋น ๋ฌธ์์ด์ด ์๋์ง ๊ฒ์ฌํ๊ธฐ
let target = "what is your name? my name is ywtechit";
console.log(/is/.test(target)); // true
console.log(/typescript/.test(target)); // false
// ex2: new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ RegExp์ new ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์์ RegExp
const str = 'table football';
const regex = new RegExp('foo*');
const sameRegex = /foo*/;
const globalRegex = new RegExp('foo*', 'g');
console.log(regex.test(str)); // true
console.log(globalRegex.lastIndex); // 0
console.log(globalRegex.test(str)); // true
console.log(globalRegex.lastIndex); // 9
console.log(globalRegex.test(str)); // false
// ex3: ์ฌ๋ฐ๋ฅธ ์ ํ๋ฒํธ ํ์์ธ์ง ํ๋ณํ๋ ํจํด
const tel = "010-1234-1234"
const regExp = /^\d{3}-\d{4}-\d{4}$/;
const result = regExp.test(tel);
console.log('result :>> ', result); // true
// ex4: http://, https://๋ก ์์ํ๋ ๋๋ฉ์ธ์ธ์ง ํ๋ณํ๋ ํจํด
const domain = "https://www.naver.com";
const regExp = /^(http|https):\/\//;
const regExp2 = /^https?:\/\//;
const result = regExp.test(domain);
console.log('result :>> ', result); // true
// ex5: html๋ก ๋๋๋ ํ์ผ๋ช
์ธ์ง ํ๋ณํ๋ ํจํด
const string = "index.html";
const regExp = /html$/
const result = regExp.test(string)
console.log('result :>> ', result); // true
// ex6: ์์์ ์ ์ต๋ 2๋ฒ๊น์ง๋ง ์ฌ์ฉํ๋ ์
๋ ฅ์ธ๊ฐ?
const isUptoTwoDecimalPoint = (input: string): boolean => {
const isIncludeDot = /[.]/g;
if (isIncludeDot.test(input)) {
const isTwoDecimalPoint = /^\d+[.]\d{1,2}$/;
if (isTwoDecimalPoint.test(input)) return true;
return false;
}
return true;
};
// ex7: ํ๋ ์ด์์ ๊ณต๋ฐฑ์ผ๋ก ์์ํ๋๊ฐ?
const string = " Hi!!";
const regExp = /^[\s]+/
const result = regExp.test(string)
console.log('result :>> ', result); // true
// ex8: ์ํ๋ฒณ ๋์๋ฌธ์ ๋๋ ์ซ์๋ก ์์ํ๊ณ ๋๋๋ฉฐ 4~10์๋ฆฌ์ธ๊ฐ?
const string = "abcd8637";
const regExp = /^[\w]{4,10}$/
const result = regExp.test(string)
console.log('result :>> ', result); // true
// ex9: ์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ ํ์์ธ๊ฐ?
const string = "ywtechit@gmail.com";
const regExp = /^[\w]([-_\.]?[\w])*@[\w]([-_\.]?[\w])*\.[a-zA-Z]{2,3}$/
const result = regExp.test(string)
console.log('result :>> ', result); // trueโโโโโโat
// General Email Regex (RFC 5322 Official Standard)
const regExp = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
// HTML5 input ํ๊ทธ์ type=”email”์ ์ฌ์ฉ๋๋ ํจํด(from W3C: Ref 5.)
<input type="email" placeholder="Enter your email" />
const regExp = /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
// ex10: ํน์๋ฌธ์ ํ๋ณํ๊ธฐ
let s = "(A(BC)D)EF(G(H)(IJ)K)LM(N)";
let answer = "";
console.log(solution(s));
function solution(s) {
for (let x of s) {
if (/[A-Z]/.test(x)) answer+=x;
}
return answer;
}
๐๐ฝ ABCDEFGHIJKLMN
replace
: ์ฃผ์ด์ง ๋ฌธ์์ด๋ด์ ์ผ์น๋ฅผ ์๋ก์ด ๋ฌธ์์ด๋ก ๋์นํ๋ ๋ฉ์๋
// ex1: ๊ณต๋ฐฑ ์ ๊ฑฐํ๊ธฐ
const str =
"๋๋๋ง์ธ๋ฏธ ๋๊ท์ ๋ฌ์๋ฌธ์์๋ก ์๋ฅด ์ฌ๋ง๋ ์๋ํ ์ ์ด๋ฐ ์ ์ฐจ๋ก ์ด๋ฆฐ ๋ฐฑ์
ฉ์ด ๋๋ฅด๊ณ ์ ธ ํ๋ฒ ์ด์
๋ ๋ง์ฐธ๋ค ์ ๋จ๋ค ์๋ฌํด๋ ๋ชฏํง ๋
ธ๋ฏธํ๋์ ๋ด ์ด๋ ์ํ์ผ ์ด์ฟ๋น๋๊ฒจ ์๋ก ์ค๋ฏ ์ฌ๋ซ ์ง๋ ๋งน๊ฐ๋
ธ๋์ฌ๋๋ง๋ค ํด์ฌ ์๋น๋๊ฒจ ๋ ๋ก ์ค๋ฉ ๋ปํํ ํ๊ณ ์ ธ ํ ๋ฐ๋ผ๋ฏธ๋๋ผ";
const result = str.replace(/\s/g, "")
console.log('result :>> ', result);
๐๐ฝ ๋๋๋ง์ธ๋ฏธ๋๊ท์๋ฌ์๋ฌธ์์๋ก์๋ฅด์ฌ๋ง๋์๋ํ ์์ด๋ฐ์ ์ฐจ๋ก์ด๋ฆฐ๋ฐฑ์
ฉ์ด๋๋ฅด๊ณ ์ ธํ๋ฒ ์ด์
๋๋ง์ฐธ๋ค์ ๋จ๋ค์๋ฌํด๋๋ชฏํง๋
ธ๋ฏธํ๋์๋ด์ด๋์ํ์ผ์ด์ฟ๋น๋๊ฒจ์๋ก์ค๋ฏ์ฌ๋ซ์ง๋๋งน๊ฐ๋
ธ๋์ฌ๋๋ง๋คํด์ฌ์๋น๋๊ฒจ๋ ๋ก์ค๋ฉ๋ปํํํ๊ณ ์ ธํ ๋ฐ๋ผ๋ฏธ๋๋ผ
// ex2: ํน์๋ฌธ์ ์ ๊ฑฐํ๊ธฐ
let s = "found7, time: study; Yduts; emit, 7Dnuof";
let notIncludeSpecialCharacter = s.replace(/[^A-z]/g, '');
๐๐ฝ foundtimestudyYdutsemitDnuof
// ex3: ํน์๋ฌธ์ ์ค์์ ๊ณต๋ฐฑ์ ์ด๋ฆฌ๊ณ ์ถ์ ๋
let notIncludeSpecialCharacter = s.replace(/[^A-z | " "]/g, '');
๐๐ฝ found time study yduts emit dnuof
์ง๊ธ๊น์ง ์ ๊ทํํ์์ ๊ฐ๋ ๊ณผ ์์ฉ ์์ ๋ฅผ ๊ฐ๋ตํ๊ฒ ์ดํด๋ณด์๋ค. ์ฒ์ ์ ๊ทํํ์์ ์ ํ์ ๋ ๋ํต ์ดํด๊ฐ ๋์ง ์์ ๋ฌธ๋ฒ์ด์๋๋ฐ, ๋ช ๋ฒ ์ฌ์ฉํด ๋ฒ๋ฆํ๋๊น ๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ๋ณด๋ค ์ด์ฉํ๊ธฐ๊ฐ ์ฝ๊ณ ํธํ๋ค. ์กฐ๊ธ์ฉ ์ ๊ทํํ์์ ์ฌ์ฉํ๋ฉฐ ๊ฒฝํ์ ์๊ณ ๋์ค์ ํ์ ์ ๋์ ํ๊ฒ ๋๋ฉด ์์ ๋ฅผ ๊น๋จน์ง ์๋๋ก ๊ธฐ๋กํด๋ฌ์ผ๊ฒ ๋ค.
Reference
๋๊ธ