λλμ΄! μ κ° κΈ°λνλ λλ§μ ννΈκ° μλ€μ! π₯°
μ΄μ μλ μ΄ ννΈλ₯Ό κ·Έμ λκ²Όλλ°, μ κ·ννμμ μ λλ‘ νΊμλ³Ό μ μκ² λμ΄ ν볡ν΄μ!
μ κ·ννμμ μΌμ ν ν¨ν΄μ κ°μ§ λ¬Έμμ΄μ μ§ν©μ νννκΈ° μν΄ μ¬μ©νλ νμ μΈμ΄λΌ ν΄μ.
μΌλ°μ μΌλ‘, μ κ·ννμμ λ€λ₯Έ μΈμ΄λ€κ³Ό μλν°λ€μ λμ²΄λ‘ λ΄μ₯λμ΄ μμ΄μ.
λ체μ μΌλ‘ λ€μ 2κ°μ§μ μ κ·ννμ λ¬Έλ²μ΄ μ‘΄μ¬νλλ°μ.
perl
)μλ°μ€ν¬λ¦½νΈλ PCRE
λ¬Έλ²μ ES3
λλΆν° λμ
νμμ΅λλ€. λ°λΌμ λ§μ½ POSIX
μ μ΅μνμ λΆλ€μ PCRE
λ¬Έλ²μ μ΅νμκΈ°λ₯Ό κΆμ₯ν΄μ.
μΌλ¨ μ λ μ΄λ€ κ²μ μ΄ν΄ν λλ§λ€ νμ μ΄ μ£Όμ μ ν΅μ¬κ³Ό μ¬μ© λͺ©μ μ΄ λ¬΄μμΈμ§λ₯Ό λͺ νν νλλ°μ!κ²°κ΅ μ μκ°μ μ κ·ννμμ μ΄ν΄ν λ μ£Όλͺ©ν λΆλΆμ λ€μκ³Ό κ°μ΅λλ€.
μ°λ¦¬, κ·Έλ¬λ©΄ ν λ² μ΄ 3κ°μ§λ₯Ό ν λλ‘ μ΄ν΄λ³ΌκΉμ? π
ν¨ν΄μ΄λΌ ν λ μ΄λ€ κ²μ΄ λ μ€λ₯΄μ ¨λμ? μλ§ λλΆλΆ μ΄λ€ νμμ λν μΌμ ν κ·μΉμ λ μ¬λ Έμ κ² κ°μμ.
μ΄λ₯Ό μ κ·ννμμ ν¨ν΄μ λμ νλ©΄ μ΄λ¨κΉμ? λ°λ‘, μ΄λ€ λ¬Έμμ΄ ννμμ λν μΌμ ν κ·μΉμ νΉμ ν λ¬Έλ²μΌλ‘ μμ ν κ²μ΄λΌ ν μ μκ² μ£ ? ππ»ββοΈ
μ΄λ¬ν ν¨ν΄μ /
μΌλ‘ μ΄κ³ λ«μμ. λ§μΉ μ리먼νΈμμ μ°λ¦¬κ° <div></div>
μμΌλ‘ μ리먼νΈμ μμκ³Ό λμ μ리λ―μ΄ λ§μ΄μ£ .
μ컨λ λ€μκ³Ό κ°μ΄ νκΈ°νλ κ²λλ€.
const regExp = /Hello/;
μμ ν¨ν΄μ μλ‘ λ€μλ©΄, ν΄λΉ ν¨ν΄κ³Ό μΌμΉνλ λ¬Έμκ° μλ€λ©΄ μ΄λ₯Ό 맀μΉνλ€λΌκ³ λ§ν©λλ€.
μ€μ λ‘λ RegExp.prototype.test
λ©μλμ String.prototype.match
λΌλ λ©μλλ₯Ό ν΅ν΄ μ΄ μΌμΉ μ¬λΆλ₯Ό νμΈν μ μλ΅λλ€.
const regExp = /Hello/;
const test = 'Hello, world!';
console.log(regExp.test(test)); // true
console.log(test.match(regExp));
// ['Hello', index: 0, input: 'Hello, world!', groups: undefined]
μ¬κΈ°μ λ°νλλ κ°μ²΄λ λ°°μ΄ κ°μ²΄λΌκ³ νμ§λ§, νλ‘νΌν° ν€κ° μ μκ° μλλΌλ μ μμ μ μ¬λ°°μ΄μ νΉμ§μ κ°νκ² μ§λλλ€.
// μ€μ λ‘ `index`, `input`κ³Ό `groups`λΌλ νλ‘νΌν°κ° μμ΅λλ€.
console.log(test.match(regExp).index); // 0
console.log(test.match(regExp).input); // 'Hello, world!'
console.log(test.match(regExp).hasOwnProperty('groups')); // true;
// '[object Array]'
Object.prototype.toString.call(test.match(regExp));
// μμ±μλ₯Ό νμΈν΄λ³΄μλ λ°°μ΄μ
λλ€.
test.match(regExp).constructor.name; // 'Array'
// lengthλ₯Ό κ°μ§λλ€. κ·Έλ¬λ κ°μ΄ μ ννμ§ μμ΅λλ€.
console.log(test.match(regExp).length); // 1
// test.match(regExp)μ λ°νκ°μ μΌμΉνλ λ¬Έμμ΄μ
λλ€.
test.match(regExp)[0]; // 'Hello'
test.match(regExp)[1]; // 'undefined'
μ΄λ, κ°μ΄ λ°λΌμ μ΅νμΌ ν μΉκ΅¬κ° νλ μμ΅λλ€. νλκ·ΈλΌλ μΉκ΅¬μΈλ°μ.
νλκ·Έλ₯Ό ν΅ν΄ μΌμ’
μ κ²μ λ°©μμ μ μν μ μμ΄μ!
λ€μ 3κ°μ§κ° μμ΅λλ€.
νλκ·Έ | μλ―Έ | μ€λͺ |
---|---|---|
i | ignore case | λμλ¬Έμ ꡬλ³μ 무μν©λλ€. |
g | global | μ μμ μΌλ‘ λͺ¨λ μΌμΉνλ λ¬Έμλ€μ κ²μν©λλ€. |
m | multi line | μ¬λ¬ νμ λ¬Έμμ΄ νμ μ¬λ¬ μ€μ κ±Έμ³ κ²μν΄μ κ²μν©λλ€. |
μ, μ°λ¦¬λ μ΄μ 2κ°μ§λ₯Ό λ°°μ μ΄μ.
λ€λ§ ν΄λΉ μ§λ¬Έμ λν΄μλ μμ§ μ€λͺ μ΄ λμ§λ₯Ό μμκ΅°μ.
π‘ κ·Έλ λ€λ©΄, μ΄μ μ κ·ννμμ λν λ€μν μ¬μ©λ°©λ²κ³Ό λ¬Έλ²λ€μ ν λ² μ΄ν΄λ³ΌκΉμ?
{m,n}
μ ν΅ν΄ ν¨κ³Όμ μΌλ‘ λ°λ³΅ κ²μμ μΆλ €λΌ μ μμ΅λλ€. μ΄λ λ μΈμμΈ m
, n
μ
m
: μ΅μ m
λ²n
: μ΅λ n
λ²λ₯Ό μλ―Έν΄μ. μ΄λ n
μ μλ΅ κ°λ₯ν©λλ€.
μ¬κΈ°μ ν¨ν΄μ, 곡백κΉμ§ 체ν¬ν μ μκΈ°μ μλΉν λ―Όκ°ν΄μ. μ λ ₯μ κ³΅λ°±μ΄ μλλ‘ μ μν©μλ€.
μμ λ₯Ό ν λ² μ΄ν΄λ³Όκ²μ.
const str = '0000000000000000000000000O0000000000'
console.log(str.match(/\O{1,1}/).index) // 25
μ£Όμ!
g
νλκ·Έλ₯Ό μ¬μ©νλ©΄index
ν€λ₯Ό νμ©ν μ μμ΅λλ€. (μ μ κ²μμ΄λκΉμ!)
λ¬Έμ λ€μμ΄λ, []
λ΄μ μ¬λ¬ λ¬Έμλ₯Ό μ
λ ₯ ν +
λ₯Ό ν κ²½μ° 1λ² μ΄μμ λ°λ³΅λλ λ¬Έμλ€μ λͺ¨λ κ²μν©λλ€.
'000-0000-0000'.match(/0+/g) // ['000', '0000', '0000']
'000-0000-0000'.match(/[0-]+/g) // ['010-1234-1234']
λ³΄ν΅ μ¬λ λ¬Έλ²κ³Ό λ§μ°¬κ°μ§λ‘ |
μ ν λλ‘ μλ―Έλ₯Ό κ°μ§ μ μλ€μ!
const isCheckAnswerPattern = /Y|N/;
const answers = {
requiredAgreement1: 'Y',
requiredAgreement2: 'Y',
optionalAgreement1: 'N',
optionalAgreement2: 'N',
};
// true
console.log(
Object.values(answers)
.every(v => isCheckAnswerPattern.test(v))
);
νΉμ []
μμ μ¬λ¬ λ¬Έμλ₯Ό λ£λ κ²½μ°, μ΄λ₯Ό OR
λ‘ μ·¨κΈν©λλ€.
const isCheckAnswerPattern = /[YN]/;
const answers = {
requiredAgreement1: 'Y',
requiredAgreement2: 'Y',
optionalAgreement1: 'N',
optionalAgreement2: 'N',
};
// true
console.log(
Object.values(answers)
.every(v => isCheckAnswerPattern.test(v))
);
[]
μμ μμλ²μ-λλ²μ
ννλ‘ μ
λ ₯ν©λλ€.
μ컨λ λ€μκ³Ό κ°μ΄ ν μ μμ΅λλ€.
const onlyNumberPattern = /[0-9]/g
// ['0', '1', '0', '1', '2', '3', '4', '1', '2', '3', '4']
'010-1234-1234'.match(onlyNumberPattern);
\d
μ \D
μ€μ§ μ«μμΈ λ¬Έμμ΄λ§ κ²μνλ κ²½μ°λ κ½€λ λ§μ΅λλ€.
μ΄λ΄ λλ ν΄λΉ ν¨ν΄μ ν΅ν΄ κ°νΈνκ² κ²μν μ μμ΅λλ€.
const onlyNumberPattern = /[\d]+/g;
'010-1234-1234'.match(onlyNumberPattern); // ['010', '1234', '1234']
\w
μ \W
μνλ²³, μ«μ, μΈλμ€μ½μ΄λ₯Ό ν¬ν¨ν λ ν΄λΉ ν¨ν΄μ μ μ©ν©λλ€.
μ컨λ λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μκ² κ΅°μ!
const email = 'young_pallete@test.com'
// [μ«μ, μνλ²³, μΈλμ€μ½μ΄]@[μ«μ, μνλ²³, μΈλμ€μ½μ΄, νμ΄ν](1~2λ²μ .[μνλ²³])μΌλ‘ μ΄λ©μΌ λ¬Έμμ΄ μ ν¨μ± κ²μ¬
const emailPattern = /^([\w]+)@([\w-]+)((.([a-z]{2,3})){1,2})$/
emailPattern.test(email) // true
μ΄λ―Έ μμ λμ μκ΅°μ!
^
μ μ΄μ©νλ©΄ 맨 μ²μ μμ μμΉλΆν° μΌμΉν΄μΌ νλ€λ μλ―Έμ
λλ€.
μ΄λ, [^...]
μ λ°©μμΌλ‘ νννλ ν¨ν΄μμ ...
μ μΌμΉνμ§ μλ ν¨ν΄μΈμ§ NOT
μ μλ―Έλ‘ ν΄μνλ μ£ΌμνμΈμ!
μ΄ μμ μμ μμμ λμ μμ΄μ!
$
μ μ΄μ©νλ©΄, νΉμ λ¬Έμμ΄ ν¨ν΄μ λ§μ§λ§μ΄ μΌμΉνλμ§λ₯Ό μλ―Έν©λλ€.
const phoneNumber = '010-1234-1234';
const phoneNumberPattern = /^\d{3}-\d{3,4}-\d{4}$/;
phoneNumberPattern.test(phoneNumber) // true
λ€μκ³Ό κ°μ΄ μ¬μ©νλ©΄ νΉμλ¬Έμ ν¬ν¨ μ¬λΆλ₯Ό κ²μ¬ κ°λ₯ν΄μ!
const specialCharPattern = /[^a-zA-Z0-9γ±-γ
γ
-γ
£κ°-ν£]/
specialCharPattern.test('μλ
!') // true
specialCharPattern.test('μλ
γ
γ
') // false
κ·Έλλ§ μ±
μμ μ μ©νλ€ μΆμ κ²λ€μ κ°μ Έμ€κ±°λ μ μλμ λ§κ² λ³ννλλ°μ!
μ¬μ€ μ΄κ±° λ§κ³ λ ν¨ν΄μ μν νΉμλ¬Έμλ μ~μ² λ§μμ π
λ°λΌμ, νμν 쑰건λ€μ΄ μλ€λ©΄, μ΄λ₯Ό κ°νΈνκ² μ²λ¦¬νκΈ° μν λ°©λ²μ΄ μλμ§ ν΄λΉ MDN - μ κ· ννμ μ°Έκ³ λ₯Ό μΆμ²λλ €μ π₯°
μ΄μ μ λ€νΈκ²μμ λ€μκ³Ό κ°μ΄ νμμμ΄μ!
const setValue = {
S: (data) => data,
D: (data) => Math.pow(data, 2),
T: (data) => Math.pow(data, 3),
"*": (data) => (2 * data),
"#": (data) => (-1 * data),
"+": (strData, nextStrData) => strData + nextStrData,
};
const getScoresArr = (dartResult) => {
const scoresArr = [];
let isLastDataStr = false;
const length = dartResult.length;
for (let i = 0; i < length; i += 1) {
const nowData = dartResult[i];
const isNowDataStr = Number.isNaN(parseInt(nowData));
if (isNowDataStr) {
const lastScore = scoresArr.pop();
scoresArr.push(
...(nowData === "*" && scoresArr.length
? [setValue[nowData](scoresArr.pop()), setValue[nowData](lastScore)]
: [setValue[nowData](lastScore)])
);
} else {
scoresArr.push(
!i || isLastDataStr ? nowData : setValue["+"](scoresArr.pop(), nowData)
);
}
isLastDataStr = isNowDataStr;
}
return scoresArr;
};
const solution = (dartResult) => {
return getScoresArr(dartResult).reduce(
(acc, cur) => acc + parseInt(cur),
0
);
};
μλΉν μ μ°¨μ μΌλ‘ νμ΄μ, μΈλ» 보기μ νλμ μ½λκ° μ 보μ΄μ§ μλκ΅°μ.
νμ§λ§ μ κ·ννμ λ¬Έλ²μΌλ‘ μ΄λ₯Ό νμ΄λ΄λ©΄, μ μΈμ μΌλ‘ μ΄λ€ λ΄μ©μΌλ‘ λ¬Έμ λ₯Ό μ κ·Όνλμ§λ₯Ό νμ
νκΈ° μ¬μμ§λλ€!
const getInteger = (now, p1, p2, p3) => (p3 ? -1 : 1) * p1 ** ['', 'S', 'D', 'T'].indexOf(p2) + 'S'
const passStarForward = (now, p1, p2, p3) => p3 + (p1 * 2) + p2
const solution = (dartResult) => dartResult
.replace(/([0-9]+)(S|D|T)(\#?)/g, getInteger) // μ μλ‘ λ°κΏμ£Όκ³ !
.replace(/([-|0-9]+)(S|D|T)(\*)/g, passStarForward) // μ€νμμ κ²½μ° 2λ°°λ‘ ν΄μ€ λ€μ μμΌλ‘ λκ²¨μ£Όκ³ !
.replace(/([-|0-9]+)(S|D|T)(\*)/g, passStarForward) // μμ μ μλ μ
λ°μ΄νΈ ν΄μ£Όκ³ !
.match(/[-|0-9]+/g) // μ μλ§ λ½μλ΄μ
.reduce((acc, cur) => acc + Number(cur), 0) // λ€ λν΄μ€λ€!
μ λ§ μ¬λ―Έμμ£ ? π₯°
μ¬μ€ μ΄ ννΈ κΈ°λλ λ§μ΄ νλ©΄μ κ±±μ λ λ§μ΄ νμ΄μ.
κ½€λ μ κ° λΆμ‘±ν λΆλΆμ΄λΌ μκ°νλλ°, μ΄λ²μ μ΄ν΄λ³΄λ©΄μ λ§μ΄ 곡ν¬μ¦μ 극볡νλ€μ!
μ‘°λ§κ° ν λ² μ΄λ₯Ό μ΄μ©ν λ¬Έμ λ νμ΄λ΄μΌκ² μ΄μ. ππ» μ΄μ!