--- title: RegExp slug: Web/JavaScript/Reference/Global_Objects/RegExp tags: - Constructor - JavaScript - Reference - RegExp - 정규 표현식 - 정규식 translation_of: Web/JavaScript/Reference/Global_Objects/RegExp ---
RegExp
생성자는 패턴을 사용해 텍스트를 판별할 때 사용합니다.
정규 표현식에 대한 소개는 JavaScript 안내서의 정규 표현식 장을 참고하세요.
RegExp
객체는 리터럴 표기법과 생성자로써 생성할 수 있습니다.
다음의 세 표현식은 모두 같은 정규 표현식을 생성합니다.
/ab+c/i new RegExp(/ab+c/, 'i') // 리터럴 new RegExp('ab+c', 'i') // 생성자
리터럴 표기법은 표현식을 평가할 때 정규 표현식을 컴파일합니다. 정규 표현식이 변하지 않으면 리터럴 표기법을 사용하세요. 예를 들어, 반복문 안에서 사용할 정규 표현식을 리터럴 표기법으로 생성하면 정규 표현식을 매번 다시 컴파일하지 않습니다.
정규 표현식 객체의 생성자(new RegExp('ab+c')
)를 사용하면 정규 표현식이 런타임에 컴파일됩니다. 패턴이 변할 가능성이 있거나, 사용자 입력과 같이 알 수 없는 외부 소스에서 가져오는 정규 표현식의 경우 생성자 함수를 사용하세요.
ECMAScript 6부터는 new RegExp(/ab+c/, 'i')
처럼, 첫 매개변수가 RegExp
이면서 flags
를 지정해도 {{jsxref("TypeError")}} ("can't supply flags when constructing one RegExp from another"
)가 발생하지 않고, 매개변수로부터 새로운 정규 표현식을 생성합니다.
생성자 함수를 사용할 경우 보통의 문자열 이스케이프 규칙(특수 문자를 문자열에 사용할 때 앞에 역빗금(\
)을 붙이는 것)을 준수해야 합니다.
예를 들어 다음 두 줄은 동일한 정규 표현식을 생성합니다.
let re = /\w+/ let re = new RegExp('\\w+')
RegExp
속성일부 {{JSxRef("RegExp")}} 속성은 같은 값에 대해 긴 이름과 짧은 (Perl 형태의) 이름 모두 가지고 있습니다. (Perl은 JavaScript가 정규 표현식을 만들 때 참고한 프로그래밍 언어입니다.) 사용하지 않는 RegExp
속성을 참고하세요.
RegExp
객체를 생성합니다.RegExp
객체의 플래그를 담은 문자열입니다..
이 줄 바꿈에 일치하는지 여부를 나타냅니다.다음 스크립트에서는 {{jsxref("String")}} 객체의 {{jsxref("String.prototype.replace()", "replace()")}} 메서드를 사용하여 이름 성씨 형태의 이름을 성씨, 이름 형태 바꿔 반환합니다.
대치 문자열에는 $1
과 $2
를 사용하여 정규 표현식 패턴의 각 괄호에 일치한 결과를 받아옵니다.
let re = /(\w+)\s(\w+)/ let str = 'John Smith' let newstr = str.replace(re, '$2, $1') console.log(newstr)
실행 결과는 "Smith, John"
입니다.
기본 줄 바꿈 문자는 플랫폼(Unix, Windows 등)마다 다릅니다. 아래의 분할 스크립트는 모든 플랫폼의 줄 바꿈을 인식합니다.
let text = 'Some text\nAnd some more\r\nAnd yet\rThis is the end' let lines = text.split(/\r\n|\r|\n/) console.log(lines) // logs [ 'Some text', 'And some more', 'And yet', 'This is the end' ]
정규 표현식 패턴의 순서를 바꾸면 작동하지 않을 수 있습니다.
let s = 'Please yes\nmake my day!' s.match(/yes.*day/); // Returns null s.match(/yes[^]*day/); // Returns ["yes\nmake my day"]
{{JSxRef("Global_Objects/RegExp/sticky", "sticky")}} 플래그는 해당 정규 표현식이 접착 판별, 즉 {{jsxref("RegExp.prototype.lastIndex")}}에서 시작하는 일치만 확인하도록 할 수 있습니다.
let str = '#foo#' let regex = /foo/y regex.lastIndex = 1 regex.test(str) // true regex.lastIndex = 5 regex.test(str) // false (lastIndex is taken into account with sticky flag) regex.lastIndex // 0 (reset after match failure)
접착 플래그 y
의 일치는 정확히 lastIndex
위치에서만 발생할 수 있으나, 전역 플래그 g
의 경우 lastIndex
또는 그 이후에서도 발생할 수 있습니다.
re = /\d/y; while (r = re.exec("123 456")) console.log(r, "AND re.lastIndex", re.lastIndex); // [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1 // [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2 // [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3 // ... and no more match.
전역 플래그 g
를 사용했다면, 3개가 아니고 6개 숫자 모두 일치했을 것입니다.
\w
와 \W
는 a
부터 z
, A
부터 Z
, 0
부터 9
_
등의 {{glossary("ASCII")}} 문자에만 일치합니다.
러시아어나 히브리어와 같은 다른 언어의 문자까지 일치하려면 \uhhhh
(이때 hhhh는 해당 문자의 16진법 Unicode 값) 문법을 사용하세요. 아래 예제에서는 문자열에서 Unicode 문자를 추출합니다.
let text = 'Образец text на русском языке' let regex = /[\u0400-\u04FF]+/g let match = regex.exec(text) console.log(match[0]) // logs 'Образец' console.log(regex.lastIndex) // logs '7' let match2 = regex.exec(text) console.log(match2[0]) // logs 'на' [did not log 'text'] console.log(regex.lastIndex) // logs '15' // and so on
유니코드 속성 이스케이프 기능을 사용해 \p{scx=Cyrl}
과 같은 간단한 구문으로 이 문제를 해결할 수 있습니다.
let url = 'http://xxx.domain.com' console.log(/[^.]+/.exec(url)[0].substr(7)) // logs 'xxx'
이 때는 정규표현식보단 URL API를 통해 브라우저에 내장된 URL 구문 분석기를 사용하는 것이 좋습니다.
명세 |
---|
{{SpecName('ESDraft', '#sec-regexp-regular-expression-objects', 'RegExp')}} |