2023.06.16
const rex = /example/gi;
console.log(rex.flags); // "gi"
function tryRex(rex, str) {
console.log(`lastIndex: ${rex.lastIndex}`);
const match = rex.exec(str);
if (match) {
console.log(`Match: ${match[0]}`);
console.log(`At: ${match.index}`);
} else {
console.log('No match');
}
}
const str = 'this is a test';
// 스티키가 아닐 때, 전체 문자열을 검색한다.
tryRex(/test/, str);
// lastIndex: 0
// Match: test
// At: 10
// 스티키, 검색하지 못함. lastIndex에서 일치해야만 한다.
const rex1 = /test/y; // `rex.lastIndex` defaults to 0
tryRex(rex1, str);
// lastIndex: 0
// No match
const rex2 = /test/y;
rex2.lastIndex = 10; // 일치시키기 원하는 곳으로 설정한다.
tryRex(rex2, str);
// lastIndex: 10
// Match: test
// At: 10
\r
와 \n
을 일치시키지 않는다.[\s\s]
(공백이 있거나 없는 모든 것), [\w\W]
(단어이거나 아닌 모든 것)와 같은 해결 방법을 사용해야 했다.[^]
(빈 부정 문자 클래스, "아무것도 아님"이 "아무것"과 동일함) 등이 있다.const str = 'Testing\nAlpha\nBravo\nCharlie\nJavaScript';
console.log(str.match(/.[A-Z]/g)); // ["aS"]
console.log(str.match(/.[A-Z]/gs)); // ["\nA", "\nB", "\nC", "aS"]
(?<name>pattern)
// Not a "new toy," just sets up the example for the next snippet using a named capture group
const rex = /testing (\d+)/g;
const result = rex.exec('This is a test: testing 123 testing');
console.log(result[0]); // testing 123
console.log(result[1]); // 123
console.log(result.index); // 16
console.log(result.input); // This is a test: testing 123 testing
const rex = /testing (?<number>\d+)/g;
const result = rex.exec('This is a test: testing 123 testing');
console.log(result[0]); // testing 123
console.log(result[1]); // 123
console.log(result.index); // 16
console.log(result.input); // This is a test: testing 123 testing
console.log(result.groups); // {"number": "123"}
([”’])
)을 사용하고 후행 따옴표에 역분 조(\1
)를 사용하여 큰 따옴표 또는 작은 따옴표로 묶인 텍스트를 찾는다.// Not a new toy, this snippet shows the anonymous version of the named backreference
// shown by the next snippet
const rex = /(["']).+?\1/g;
const str = "testing 'a one', \"and'a two\", and'a three";
console.log(str.match(rex)); // ["'a one'", "\"and'a two\""]
\k<name>
양식이다.const rex = /(?<quote>["']).+?\k<quote>/g;
const str = "testing 'a one', \"and'a two\", and'a three";
console.log(str.match(rex)); // ["'a one'", "\"and'a two\""]
\1
)으로 명명된 캡처 그룹을 참조할 수 있다.$<name>
양식의 명명된 토큰을 사용할 수 있 다.const rex = /^(?<year>\d{2}|\d{4})[-\/](?<month>\d{1,2})[-\/](?<day>\d{1,2})$/;
const str = '2019-02-14'.replace(rex, '$<day>/$<month>/$<year>');
console.log(str); // "14/02/2019"
(?<=Y)
이며, 여기서 Y는 찾을 엔트리다.const str1 = 'We sold 10 cases for £20 each, and 5 cases for £12.99 each';
const rex1 = /(?<=£)[\d.]+/g;
console.log(str1.match(rex1));
// => ["20", "12.99"]
([\d.]+)
에 대한 일치를 찾은 다음 후방 탐색에서 표현식의 각 부분을 가져와서 앞의 텍스트에 대해 테스트하여 후방 탐색 적용한다.(?<IY)
양식을 가진다. 여기서 Y는 존재해서는 안 되는 것이다. 따라서 파운드 기호 뒤의 숫자를 일치시키는 대신 이전 예의 10과 5를 일치시키려면 첫 번째 생각은 아마도 (?<= )
를 (?<! )
로 변경하는 것이다.const str3 = 'We sold 10 cases for £20 each, and 5 cases for £12.99 each';
const rex3 = /(?<!£)[\d.]+/g;
console.log(str3.match(rex3));
// ['10', '0', '5', '2.99']
ㅤ
가 없고(바로 앞의 문자는 2임) 12.99의 2.99도 없다(2.99 바로 앞의 문자는 1이다). 따라서 부정 후방 탐색에 숫자와 소수를 추가해야 한다.const behind = /(?<=(?<left>\w+)(?<right>\w+))\d$/;
const behindMatch = "ABCD1".match(behind);
console.log(behindMatch.groups.left);
// => "A"
console.log(behindMatch.groups.right);
// => "BCD"
const behindAgain = /(?<=(\w+)(\w+))\d$/;
const behindMatchAgain = 'ABCD1'.match(behindAgain);
console.log(behindMatchAgain[1]);
// => "A"
console.log(behindMatchAgain[2]);
// => "BCD"
\uNNNN
은 단일 UTF-16 코드 단위를 정의한다. 그러나 코드 단위는 대리 쌍의 절반에 불과할 수 있다.U+1F60A
)를 일치시키려면 두 개의 UTF-16 단위(0xD83D
와 0xDEOA
)를 나타내는 두 개의 기본 유니코드 이스케이프 시퀀스가 필요하다.// Note: This file is encoded in UTF-8. Your system may or may not have a different default encoding.
// These are code UNIT escapes; the next snippet has code POINT escapes
const rex = /\uD83D\uDE0A/;
const str = 'Testing: 😊 ';
console.log(rex.test(str)); // true
\u
뒤의 중괄호({
) 다음에 16진수로 표시된 코드 포인트 값과 닫는 중괄호(}
)를 대신 사용할 수 있다.// Note: This file is encoded in UTF-8. Your system may or may not have a different default encoding.
const rex = /\u{1F60A}/u;
const str = 'Testing: 😊 ';
console.log(rex.test(str)); // true
/[\u{1F600}-\u{1F64F}]
)의 모든 포인트와 일치한다.í
가 라틴 문자이고 알파벳이며 숫자가 아니며 구두점이 아님을 알려줄 수 있다. 이러한 다양한 것을 유니코드 속성이라고 한다.\p{Alphabetic}
표현식은 이진 속성 Alphabetic
을 사용하여 유니코드 표준에서 알파벳으로 간주 되는 모든 문자와 일치시킨다.\p{로 시작하고}
로 끝난다. 속성은 중괄호 내부와 일치한다.\p
는 긍정 유니코드 속성 일치를 위한 것이다. 부정의 경우 소문자 대신 대문자 P를 사용한다.// Match alphabetic properties:
const rex1 = /\p{Alphabetic}/gu;
const s1 = "Hello, I'm James.";
console.log(s1.match(rex1));
// => ["H", "e", "l", "l", "o", "I", "m", "J", "a", "m", "e", "s"]
// Match non-alphabetic properties:
const rex2 = /\P{Alphabetic}/gu;
const s2 = "Hello, I'm James.";
console.log(s2.match(rex2));
// => [",", " ", "\"", " ", "."]
// Match characters in Greek script:
const rex3 = /\p{Script_Extensions=Greek}/gu;
const s3 = 'The greek letters alpha (α), beta (β), and gamma (γ) are used...';
console.log(s3.match(rex3));
// => ["α", "β", "γ"]
// Find punctuation, both listing General_Category explicitly and using
// the shorthand form leaving it off:
const rex4a = /\p{General_Category=Punctuation}/gu;
const rex4b = /\p{Punctuation}/gu;
const s4 = 'Hello, my name is Pranay. It means "romance" in Hindi.';
console.log(s4.match(rex4a));
// => [",", "'", ".", "\"", "\"", "."]
console.log(s4.match(rex4b));
// => [",", "'", ".", "\"", "\"", "."]
^
없이 스티키플래그(y
)를 대신 사용하자..
을 대신 사용하자.// 이모지 유니코드 블록과 딩뱃 블록을 모두 일치키려면..
// ASIS
const rex = /(?:\uD83D[\uDE00-\uDE4F]|[\u2700-\u27BF])/;
// TOBE
const rex = /[\u{1F600}-\u{1F64F}\u{1F680}-\u{1F6FF}]/u;