μ κ· ννμ(regular expression)μ μΌμ ν ν¨ν΄μ κ°μ§ λ¬Έμμ΄μ μ§ν¨μ νννκΈ° μν΄ μ¬μ©νλ νμ μΈμ΄(formal language)λ€. μ κ· ννμμ λ¬Έμμ΄μ λμμΌλ‘ ν¨ν΄ λ§€μΉ κΈ°λ₯μ μ 곡νλ€. ν¨ν΄ λ§€μΉ κΈ°λ₯μ΄λ νΉμ ν¨ν΄κ³Ό μΌμΉνλ λ¬Έμμ΄μ κ²μνκ±°λ μΆμΆ λλ μΉνν μ μλ κΈ°λ₯μ λ§νλ€.
μ κ· ννμ κ°μ²΄(RegExp κ°μ²΄)λ₯Ό μμ±νκΈ° μν΄μλ μ κ· ννμ 리ν°λ΄κ³Ό RegExp μμ±μ ν¨μλ₯Ό μ¬μ©ν μ μλ€. μΌλ°μ μΈ λ°©λ²μ μ κ· ννμ 리ν°λ΄μ μ¬μ©νλ κ²μ΄λ€. μ κ· ννμ 리ν°λ΄μ λ€μκ³Ό κ°μ΄ νννλ€.
const target = 'Is this all there is?';
// ν¨ν΄: is
// νλκ·Έ: i => λμλ¬Έμλ₯Ό ꡬλ³νμ§ μκ³ κ²μνλ€.
const regexp = /is/i;
// test λ©μλλ target λ¬Έμμ΄μ λν΄ μ κ·ννμ regexpμ ν¨ν΄μ κ²μνμ¬ λ§€μΉ κ²°κ³Όλ₯Ό λΆλ¦¬μΈ κ°μΌλ‘ λ°ννλ€.
regexp.test(target); // -> true
RegExp μμ±μ ν¨μλ₯Ό μ¬μ©νμ¬ RegExp κ°μ²΄λ₯Ό μμ±ν μλ μλ€.
const target = 'Is this all there is?';
const regexp = new RegExp(/is/i); // ES6
// const regexp = new RegExp(/is/, 'i');
// const regexp = new RegExp('is', 'i');
regexp.test(target); // -> true
RegExp μμ±μ ν¨μλ₯Ό μ¬μ©νλ©΄ λ³μλ₯Ό μ¬μ©ν΄ λμ μΌλ‘ RegExp κ°μ²΄λ₯Ό μμ±ν μ μλ€.
const count = (str, char) => (str.match(new RegExp(char, 'gi')) ?? []).length;
count('Is this all there is?', 'is'); // -> 3
count('Is this all there is?', 'xx'); // -> 0
μ κ· ννμμ μ¬μ©νλ λ©μλλ RegExp.prototype.exec, RegExp.prototype.test, String.prototype.match, String.prototype.replace, String.prototype.search, String.prototype.split λ±μ΄ μλ€.
exec λ©μλλ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ λν΄ μ κ· ννμμ ν¨ν΄μ κ²μνμ¬ λ§€μΉ κ²°κ³Όλ₯Ό λ°°μ΄λ‘ λ°ννλ€. λ§€μΉ κ²°κ³Όκ° μλ κ²½μ° nullμ λ°ννλ€.
const target = 'Is this all there is?';
const regExp = /is/;
regExp.exec(target); // -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
test λ©μλλ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ λν΄ μ κ· ννμμ ν¨ν΄μ κ²μνμ¬ λ§€μΉ κ²°κ³Όλ₯Ό λΆλ¦¬μΈ κ°μΌλ‘ λ°ννλ€.
const target = 'Is this all there is?';
const regExp = /is/;
regExp.test(target); // -> true
String νμ€ λΉνΈμΈ κ°μ²΄κ° μ 곡νλ match λ©μλλ λμ λ¬Έμμ΄κ³Ό μΈμλ‘ μ λ¬λ°μ μ κ· ννμκ³Όμ λ§€μΉ κ²°κ³Όλ₯Ό λ°°μ΄λ‘ λ°ννλ€.
const target = 'Is this all there is?';
const regExp = /is/;
target.match(regExp); // -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
exec λ©μλλ λ¬Έμμ΄ λ΄μ λͺ¨λ ν¨ν΄μ κ²μνλ g νλκ·Έλ₯Ό μ§μ ν΄λ 첫 λ²μ§Έ λ§€μΉ κ²°κ³Όλ§ λ°ννλ€. νμ§λ§ String.prototype.match λ©μλλ gνλκ·Έκ° μ§μ λλ©΄ λͺ¨λ λ§€μΉ κ²°κ³Όλ₯Ό λ°°μ΄λ‘ λ°ννλ€.
const target = 'Is this all there is?';
const regExp = /is/g;
target.match(regExp); // -> ["is", "is"]
ν¨ν΄κ³Ό ν¨κ» μ κ· ννμμ ꡬμ±νλ νλκ·Έλ μ κ· ννμμ κ²μ λ°©μμ μ€μ νκΈ° μν΄ μ¬μ©νλ€.
const target = 'Is this all there is?';
// target λ¬Έμμ΄μμ is λ¬Έμμ΄μ λμλ¬Έμλ₯Ό ꡬλ³νμ¬ ν λ²λ§ κ²μνλ€.
target.match(/is/);
// -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
// target λ¬Έμμ΄μμ is λ¬Έμμ΄μ λμλ¬Έμλ₯Ό ꡬλ³νμ§ μκ³ ν λ²λ§ κ²μνλ€.
target.match(/is/i);
// -> ["Is", index: 0, input: "Is this all there is?", groups: undefined]
// target λ¬Έμμ΄μμ is λ¬Έμμ΄μ λμλ¬Έμλ₯Ό ꡬλ³νμ¬ μ μ κ²μνλ€.
target.match(/is/g);
// -> ["is", "is"]
// target λ¬Έμμ΄μμ is λ¬Έμμ΄μ λμλ¬Έμλ₯Ό ꡬλ³νμ§ μκ³ μ μ κ²μνλ€.
target.match(/is/ig);
// -> ["Is", "is", "is"]
μ κ· ννμμ ν¨ν΄μ λ¬Έμμ΄μ μΌμ ν κ·μΉμ νννκΈ° μν΄ μ¬μ©νλ©°,μ κ· ννμμ νλκ·Έλ μ κ· ννμμ κ²μ λ°©μμ μ€μ νκΈ° μν΄ μ¬μ©νλ€.
ν¨ν΄μ /λ‘ μ΄κ³ λ«μΌλ©° λ¬Έμμ΄μ λ°μ΄νλ μλ΅νλ€. λν ν¨ν΄μ νΉλ³ν μλ―Έλ₯Ό κ°μ§λ λ©νλ¬Έμ λλ κΈ°νΈλ‘ ννν μ μλ€.
μ κ· ννμμ ν¨ν΄μ λ¬Έμ λλ λ¬Έμμ΄μ μ§μ νλ©΄ κ²μ λμ λ¬Έμμ΄μμ ν¨ν΄μΌλ‘ μ§μ ν λ¬Έμ λλ λ¬Έμμ΄μ κ²μνλ€.
const target = 'Is this all there is?';
// 'is' λ¬Έμμ΄κ³Ό 맀μΉνλ ν¨ν΄. νλκ·Έκ° μλ΅λμμΌλ―λ‘ λμλ¬Έμλ₯Ό ꡬλ³νλ€.
const regExp = /is/;
// targetκ³Ό μ κ· ννμμ΄ λ§€μΉνλμ§ ν
μ€νΈνλ€.
regExp.test(target); // -> true
// targetκ³Ό μ κ· ννμμ λ§€μΉ κ²°κ³Όλ₯Ό ꡬνλ€.
target.match(regExp);
// -> ["is", index: 5, input: "Is this all there is?", groups: undefined]
λμλ¬Έμλ₯Ό ꡬλ³νμ§ μκ³ κ²μνλ €λ©΄ νλκ·Έ iλ₯Ό μ¬μ©νλ€.
const target = 'Is this all there is?';
// 'is' λ¬Έμμ΄κ³Ό 맀μΉνλ ν¨ν΄. νλκ·Έ iλ₯Ό μΆκ°νλ©΄ λμλ¬Έμλ₯Ό ꡬλ³νμ§ μλλ€.
const regExp = /is/i;
target.match(regExp);
// -> ["Is", index: 0, input: "Is this all there is?", groups: undefined]
κ²μ λμ λ¬Έμμ΄ λ΄μμ ν¨ν΄κ³Ό 맀μΉνλ λͺ¨λ λ¬Έμμ΄μ μ μ κ²μνλ €λ©΄ νλκ·Έ gλ₯Ό μ¬μ©νλ€.
const target = 'Is this all there is?';
// 'is' λ¬Έμμ΄κ³Ό 맀μΉνλ ν¨ν΄.
// νλκ·Έ gλ₯Ό μΆκ°νλ©΄ λμ λ¬Έμμ΄ λ΄μμ ν¨ν΄κ³Ό μΌμΉνλ λͺ¨λ λ¬Έμμ΄μ μ μ κ²μνλ€.
const regExp = /is/ig;
target.match(regExp); // -> ["Is", "is", "is"]
. μ μμμ λ¬Έμ ν κ°λ₯Ό μλ―Ένλ€. λ¬Έμμ λ΄μ©μ 무μμ΄λ μκ΄μλ€. λ€μ μμ μ κ²½μ° .μ 3κ° μ°μνμ¬ ν¨ν΄μ μμ±νμΌλ―λ‘ λ¬Έμμ λ΄μ©κ³Ό μκ΄μμ΄ 3μ리 λ¬Έμμ΄κ³Ό 맀μΉνλ€.
const target = 'Is this all there is?';
// μμμ 3μ리 λ¬Έμμ΄μ λμλ¬Έμλ₯Ό ꡬλ³νμ¬ μ μ κ²μνλ€.
const regExp = /.../g;
target.match(regExp); // -> ["Is ", "thi", "s a", "ll ", "the", "re ", "is?"]
{m, n}μ μμ ν¨ν΄(λ€μ μμ μ κ²½μ° A)μ΄ μ΅μ mλ², μ΅λ nλ² λ°λ³΅λλ λ¬Έμμ΄μ μλ―Ένλ€. μ½€λ§ λ€μ κ³΅λ°±μ΄ μμΌλ©΄ μ μ λμνμ§ μλλ€.
const target = 'A AA B BB Aa Bb AAA';
// 'A'κ° μ΅μ 1λ², μ΅λ 2λ² λ°λ³΅λλ λ¬Έμμ΄μ μ μ κ²μνλ€.
const regExp = /A{1,2}/g;
target.match(regExp); // -> ["A", "AA", "A", "AA", "A"]
{n}μ μμ ν¨ν΄μ΄ nλ² λ°λ³΅λλ λ¬Έμμ΄μ μλ―Ένλ€. μ¦, {n}μ {n, n}κ³Ό κ°λ€.
const target = 'A AA B BB Aa Bb AAA';
// 'A'κ° 2λ² λ°λ³΅λλ λ¬Έμμ΄μ μ μ κ²μνλ€.
const regExp = /A{2}/g;
target.match(regExp); // -> ["AA", "AA"]
{n,}μ μμ ν¨ν΄μ΄ μ΅μ nλ² μ΄μ λ°λ³΅λλ λ¬Έμμ΄μ μλ―Ένλ€.
const target = 'A AA B BB Aa Bb AAA';
// 'A'κ° μ΅μ 2λ² μ΄μ λ°λ³΅λλ λ¬Έμμ΄μ μ μ κ²μνλ€.
const regExp = /A{2,}/g;
target.match(regExp); // -> ["AA", "AAA"]
+λ μμ ν¨ν΄μ΄ μ΅μ νλ² μ΄μ λ°λ³΅λλ λ¬Έμμ΄μ μλ―Ένλ€. μ¦, +λ {1, }κ³Ό κ°λ€.
const target = 'A AA B BB Aa Bb AAA';
// 'A'κ° μ΅μ ν λ² μ΄μ λ°λ³΅λλ λ¬Έμμ΄('A, 'AA', 'AAA', ...)μ μ μ κ²μνλ€.
const regExp = /A+/g;
target.match(regExp); // -> ["A", "AA", "A", "AAA"]
?λ μμ ν¨ν΄μ΄ μ΅λ ν λ²(0λ² ν¬ν¨)μ΄μ λ°λ³΅λλ λ¬Έμμ΄μ μλ―Ένλ€. μ¦, ?λ {0, 1}κ³Ό κ°λ€.
const target = 'color colour';
// 'colo' λ€μ 'u'κ° μ΅λ ν λ²(0λ² ν¬ν¨) μ΄μ λ°λ³΅λκ³ 'r'μ΄ μ΄μ΄μ§λ λ¬Έμμ΄ 'color', 'colour'λ₯Ό μ μ κ²μνλ€.
const regExp = /colou?r/g;
target.match(regExp); // -> ["color", "colour"]
|μ orμ μλ―Έλ₯Ό κ°λλ€.
const target = 'A AA B BB Aa Bb';
// 'A' λλ 'B'λ₯Ό μ μ κ²μνλ€.
const regExp = /A|B/g;
target.match(regExp); // -> ["A", "A", "A", "B", "B", "B", "A", "B"]
[ ... ] λ΄μ ^μ notμ μλ―Έλ₯Ό κ°λλ€. μλ₯Ό λ€μ΄, [^0-9]λ μ«μλ₯Ό μ μΈν λ¬Έμλ₯Ό μλ―Ένλ€. λ°λΌμ [0-9]μ κ°μ μλ―Έμ \dμ λ°λλ‘ λμνλ \Dλ [^0~9]μ κ°κ³ , [A-Za-z0-9_]μ κ°μ μλ―Έμ \wμ λ°λλ‘ λμνλ \Wλ [A-Za-z0-9_]μ κ°λ€.
const target = 'AA BB 12 Aa Bb';
// μ«μλ₯Ό μ μΈν λ¬Έμμ΄μ μ μ κ²μνλ€.
const regExp = /[^0-9]+/g;
target.match(regExp); // -> ["AA BB ", " Aa Bb"]
[ ... ] λ°μ ^μ λ¬Έμμ΄μ μμμ μλ―Ένλ€. λ¨, [ ... ] λ΄μ ^λ notμ μλ―Έλ₯Ό κ°μ§λ―λ‘ μ£ΌμνκΈ° λ°λλ€.
const target = 'https://poiemaweb.com';
// 'https'λ‘ μμνλμ§ κ²μ¬νλ€.
const regExp = /^https/;
regExp.test(target); // -> true
$λ λ¬Έμμ΄μ λ§μ§λ§μ μλ―Ένλ€.
const target = 'https://poiemaweb.com';
// 'com'μΌλ‘ λλλμ§ κ²μ¬νλ€.
const regExp = /com$/;
regExp.test(target); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ βhttp://β λλ βhttps://β λ‘ μμνλμ§ κ²μ¬νλ€.
const url = 'https://example.com';
// 'http://' λλ 'https://'λ‘ μμνλμ§ κ²μ¬νλ€.
/^https?:\/\//.test(url); // -> true
/^(http|https):\/\//.test(url); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ βhtmlβλ‘ λλλμ§ κ²μ¬νλ€. β$βλ λ¬Έμμ΄μ λ§μ§λ§μ μλ―Ένλ€.
const fileName = 'index.html';
// 'html'λ‘ λλλμ§ κ²μ¬νλ€.
/html$/.test(fileName); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ μ«μλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μΈμ§ κ²μ¬νλ€.
const target = '12345';
// μ«μλ‘λ§ μ΄λ£¨μ΄μ§ λ¬Έμμ΄μΈμ§ κ²μ¬νλ€.
/^\d+$/.test(target); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ νλ μ΄μμ 곡백μΌλ‘ μμνλμ§ κ²μ¬νλ€.
const target = ' Hi!';
// νλ μ΄μμ 곡백μΌλ‘ μμνλμ§ κ²μ¬νλ€.
/^[\s]+/.test(target); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ μνλ²³ λμλ¬Έμ λλ μ«μλ‘ μμνκ³ λλλ©° 4~10μ리μΈμ§ κ²μ¬νλ€.
const id = 'abc123';
// μνλ²³ λμλ¬Έμ λλ μ«μλ‘ μμνκ³ λλλ©° 4 ~ 10μ리μΈμ§ κ²μ¬νλ€.
/^[A-Za-z0-9]{4,10}$/.test(id); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ λ©μΌ μ£Όμμ νμμ λ§λμ§ κ²μ¬νλ€.
const email = 'ungmo2@gmail.com';
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/.test(email); // -> true
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ΄ νΈλν° λ²νΈ νμμ λ§λμ§ κ²μ¬νλ€.
const cellphone = '010-1234-5678';
/^\d{3}-\d{3,4}-\d{4}$/.test(cellphone); // -> true
λ€μ μμ λ κ²μ λμ λ¬Έμμ΄μ νΉμ λ¬Έμκ° ν¬ν¨λμ΄ μλμ§ κ²μ¬νλ€.
const target = 'abc#123';
// A-Za-z0-9 μ΄μΈμ λ¬Έμκ° μλμ§ κ²μ¬νλ€.
(/[^A-Za-z0-9]/gi).test(target); // -> true