js 정규식의 조건입니다. Javascript에서 정규식을 사용합니다. 정규식 개체 메서드

정규식은 문자 패턴을 설명하는 개체입니다. JavaScript의 RegExp 클래스는 다음을 나타냅니다. 정규 표현식, String 및 RegExp 클래스 개체는 정규식을 사용하여 패턴 일치와 텍스트 검색 및 바꾸기 작업을 수행하는 메서드를 정의합니다.

정규식은 들어오는 데이터를 처리하는 강력한 도구입니다. 텍스트를 바꾸거나 검색해야 하는 작업은 이 "언어 내의 언어"를 사용하면 아름답게 해결할 수 있습니다.

창조

안에 자바스크립트 일반표현식은 RegExp 객체로 표현됩니다. RegExp 객체는 RegExp() 생성자를 사용하여 생성할 수 있지만 특수 리터럴 구문을 사용하여 생성되는 경우가 더 많습니다. 생성 방법:

// 정규식 리터럴 사용: var re = /ab+c/;

정규식 리터럴을 사용하면 스크립트를 구문 분석할 때 정규식이 미리 컴파일됩니다.

// RegExp 객체의 함수 생성자 호출 var re = new RegExp("ab+c");

생성자를 사용하면 스크립트 실행 중에 정규식을 컴파일해야 합니다. 사용 이 방법표현이 변경될 것으로 알려진 경우 필요합니다.

정규식의 특수 문자

\ - 을 위한 일반 문자– 그들을 특별하게 만듭니다. 예를 들어 /s/라는 표현은 단순히 문자 's'를 찾습니다. 그리고 s 앞에 \를 넣으면 /\s/는 이미 다음을 의미합니다. 공백 문자.

^ – 입력 데이터의 시작을 나타냅니다. 여러 줄 검색 플래그("m")가 설정된 경우 새 줄의 시작 부분에서도 작동합니다.

$ – 입력 데이터의 끝을 나타냅니다. 여러 줄 검색 플래그가 설정되어 있으면 줄 끝에서도 작동합니다.

* - 0회 이상 반복됨을 나타냅니다. 예를 들어, /bo*/는 "A ghost booooed"에서 'boooo'를 찾고 "A Bird warbled"에서 'b'를 찾지만, "A sheep grunted"에서는 아무 것도 찾지 않습니다.

+ – 1회 이상 반복됨을 나타냅니다. (1,)과 동일합니다. 예를 들어, /a+/는 "candy"의 'a' 및 "caaaaaaandy"의 모든 'a'와 일치합니다.

? – 요소가 존재할 수도 있고 존재하지 않을 수도 있음을 나타냅니다.

. – (소수점)은 개행 문자(\n \r \u2028 또는 \u2029) 이외의 문자를 나타냅니다. ([\s\S]를 사용하여 개행 문자를 포함한 모든 문자를 검색할 수 있습니다).

(x) – x를 찾고 기억합니다. 이것을 "메모리 브래킷"이라고 합니다. 예를 들어, /(foo)/는 "foo bar"에서 'foo'를 찾아 기억합니다. 발견된 하위 문자열은 검색 결과 배열이나 RegExp 개체의 미리 정의된 속성인 $1, ..., $9에 저장됩니다.

(?:x) – x를 찾았지만 찾은 내용을 기억하지 못합니다. 이것을 "기억하지 않는 괄호"라고 합니다. 발견된 하위 문자열은 결과 배열 및 RegExp 속성에 저장되지 않습니다. 모든 괄호와 마찬가지로 괄호 안의 내용을 단일 하위 패턴으로 결합합니다.

x(?=y) – x 뒤에 y가 오는 경우에만 x를 찾습니다. 예를 들어, /Jack(?=Sprat)/는 뒤에 'Sprat'가 올 경우에만 'Jack'과 일치합니다. /Jack(?=Sprat|Frost)/는 'Sprat' 또는 'Frost'가 뒤에 오는 경우에만 'Jack'을 찾습니다. 그러나 'Sprat'이나 'Frost'는 검색 결과에 나타나지 않습니다.

x(?!y) – x 뒤에 y가 없는 경우에만 x를 찾습니다. 예를 들어, /\d+(?!\.)/는 뒤에 소수점이 없는 숫자에만 일치합니다. /\d+(?!\.)/.exec("3.141")은 141을 찾지만 3.141은 찾지 않습니다.

x|y – x 또는 y를 찾습니다. 예를 들어, /green|red/는 "green apple"의 'green'과 "red apple"의 'red'를 일치시킵니다.

(n) – 양의 정수. 이전 요소의 정확히 n번의 반복을 찾습니다.

(n,) – 양의 정수. 요소의 n개 이상의 반복을 찾습니다.

(n,m) – 양의 정수. 요소의 n~m 반복을 찾습니다.

– 문자 세트. 나열된 문자 중 하나를 찾습니다. 대시를 사용하여 간격을 표시할 수 있습니다. 예를 들어 - 와 동일합니다.

[^xyz] – 세트에 지정된 문자 이외의 모든 문자입니다. 범위를 지정할 수도 있습니다. 예를 들어, [^abc]는 [^a-c]와 동일합니다.

[\b] - 백스페이스 문자를 찾습니다.

\b – 단어 경계(라틴어)를 찾습니다.

\B – 단어가 아닌 경계를 나타냅니다. 예를 들어, /\w\Bn/은 "noonday"의 'on'과 일치하고, /y\B\w/는 "possously Tuesday"의 'ye'와 일치합니다.

\cX – X – A부터 Z까지의 문자. 문자열의 제어 문자를 나타냅니다. 예를 들어 /\cM/은 Ctrl-M 문자를 나타냅니다.

\d - 모든 알파벳에서 숫자를 찾습니다.

\D – 숫자가 아닌 문자(모두 알파벳)를 찾습니다. [^0-9]는 일반 숫자와 동일합니다.

\f,\r,\n – 해당 특수 문자 용지 공급, 줄 바꿈, 줄 바꿈.

\s – 공백, 탭, 줄 바꿈 및 기타 유니코드 공백 문자를 포함한 모든 공백 문자와 일치합니다.

\S – 공백을 제외한 모든 문자와 일치합니다.

\t – 탭 문자.

\v – 세로 탭 문자.

\w – 문자, 숫자, 밑줄을 포함한 모든 (라틴어) 단어 문자와 일치합니다. 동등한.

\W - 라틴어가 아닌 단어 기호를 찾습니다. [^A-Za-z0-9_]와 동일합니다.

\0 – NUL 문자와 일치합니다.

\xhh – 코드가 hh(16진수 2자리)인 문자를 찾습니다.

\uhhhh – 코드가 hhhh(4자리 16진수)인 문자를 찾습니다.

플래그

정규식 플래그는 상위 수준 패턴 일치 규칙을 지정합니다. 나머지 정규식 문법과 달리 플래그는 슬래시 문자 사이가 아니라 두 번째 문자 뒤에 지정됩니다. 안에 자바스크립트세 가지 플래그가 지원됩니다.

i 플래그는 패턴 검색이 대소문자를 구분해야 함을 나타내고, g 플래그는 검색이 전역적이어야 함을 나타냅니다. 문자열에서 일치하는 모든 항목을 찾아야 합니다. m 플래그는 여러 줄 패턴 검색을 수행합니다. 검색 중인 문자열 표현식에 개행 문자가 포함된 경우 이 모드에서는 앵커 문자 ^ 및 $가 전체 문자열 표현식의 시작과 끝과 일치할 뿐만 아니라 각 텍스트 줄의 시작과 끝과도 일치됩니다. 플래그는 어떤 조합으로도 결합될 수 있습니다.

문자열 클래스 메소드

Strings는 정규 표현식을 사용하는 네 가지 방법을 지원합니다.

검색() 메서드

정규식을 인수로 사용하고 일치하는 하위 문자열의 첫 번째 문자 위치를 반환하거나 일치하는 항목이 없으면 -1을 반환합니다. 예를 들어 다음 호출은 4를 반환합니다.

Var result = "JavaScript".search(/script/i); // 4

search() 메서드에 대한 인수가 정규식이 아닌 경우 먼저 RegExp 생성자에 전달하여 변환됩니다. search() 메서드는 지원되지 않습니다. 글로벌 검색인수에서 g 플래그를 무시합니다.

교체() 메서드

검색 및 바꾸기 작업을 수행합니다. 첫 번째 인수로 정규식을 사용하고 두 번째 인수로 대체 문자열을 사용합니다. 이 메소드는 일치를 위해 호출된 행을 검색합니다. 지정된 템플릿. 정규식에 g 플래그가 포함된 경우, replacement() 메서드는 발견된 모든 일치 항목을 대체 문자열로 바꿉니다. 그렇지 않으면 발견된 첫 번째 일치 항목만 대체됩니다.

match() 메소드

정규식을 유일한 인수로 사용하거나 해당 인수를 RegExp() 생성자에 전달하여 해당 인수를 정규식으로 변환하고 검색 결과가 포함된 배열을 반환합니다. 정규식에 g 플래그가 설정된 경우 메서드는 문자열에 있는 모든 일치 항목의 배열을 반환합니다. 예를 들어:

// ["1", "2", "3"]을 반환합니다. var result = "1 더하기 2는 3입니다.".match(/\d+/g);

정규식에 g 플래그가 포함되어 있지 않으면 match() 메서드는 전역 검색을 수행하지 않습니다. 단지 첫 번째 일치 항목을 찾습니다. 그러나 match()는 메서드가 전역 검색을 수행하지 않는 경우에도 배열을 반환합니다. 이 경우 배열의 첫 번째 요소는 발견된 하위 문자열이고 나머지 모든 요소는 정규식의 하위 표현식입니다.

분할() 메서드

이 메서드는 인수를 구분 기호로 사용하여 호출되는 문자열을 하위 문자열 배열로 분할합니다. 예를 들어:

"123,456,789".split(","); // ["123","456","789"]를 반환합니다.

Split() 메서드는 정규식을 인수로 사용할 수도 있습니다. 이는 방법을 더욱 강력하게 만듭니다.

RegExp 객체

RegExp() 생성자는 하나 또는 두 개의 문자열 인수를 사용하여 새 RegExp 개체를 만듭니다. 생성자의 첫 번째 인수는 정규식의 본문을 포함하는 문자열입니다. 정규식 리터럴에서 슬래시 문자 사이에 나타나야 하는 텍스트입니다. RegExp()에 대한 두 번째 인수가 누락되었을 수 있습니다. 지정된 경우 정규식 플래그를 정의합니다. g, i, m 문자 중 하나이거나 이들 문자의 조합이어야 합니다.

정규식 속성

각 RegExp 객체에는 다음과 같은 5가지 속성이 있습니다.

  • source는 정규식의 텍스트를 포함하는 읽기 전용 문자열입니다.
  • global은 정규식에 g 플래그가 있는지 여부를 지정하는 읽기 전용 부울 값입니다.
  • 정규식에서는 I를 무시합니다.
  • multiline은 m 플래그가 정규식에 있는지 여부를 결정하는 읽기 전용 부울 값입니다.
  • lastIndex는 읽기/쓰기 정수입니다. g 플래그가 있는 패턴의 경우 이 속성에는 다음 검색이 시작되어야 하는 줄의 위치 번호가 포함됩니다.
RegExp 메서드

RegExp 개체는 패턴 일치를 수행하는 두 가지 메서드를 정의합니다.

exec() 메서드

exec() 메소드는 지정된 문자열에 대해 정규식을 실행합니다. 문자열에서 일치하는 항목을 찾습니다. 일치하는 항목이 없으면 메서드는 null을 반환합니다. 그러나 일치하는 항목이 발견되면 g 플래그 없이 검색하기 위해 match() 메서드에서 반환된 배열과 동일한 배열을 반환합니다.

배열의 0 요소에는 정규식과 일치하는 문자열이 포함되고 모든 후속 요소에는 모든 하위 표현식과 일치하는 하위 문자열이 포함됩니다. match()와 달리 exec() 메서드는 정규식의 g 플래그 존재 여부와 관계없이 구조를 갖는 배열을 반환합니다.

exec()가 동일한 정규식에서 두 번째 호출되면 lastIndex 속성에 지정된 위치의 문자에서 검색을 시작합니다. exec()가 일치하는 항목을 찾지 못하면 lastIndex 속성이 0으로 설정됩니다.

시험 방법

문자열을 가져와 문자열이 정규식과 일치하면 true를 반환합니다.

Var 패턴 = /java/i; 패턴.테스트("자바스크립트"); // 참을 반환

test()를 호출하는 것은 exec()를 호출하는 것과 같습니다. exec()가 null이 아닌 다른 것을 반환하면 true를 반환합니다. 이러한 이유로 test() 메서드는 전역 정규 표현식에서 호출될 때 exec() 메서드와 동일한 방식으로 동작합니다. 즉, 검색을 시작합니다. 지정된 줄위치에서, 숙소에서 제공한 lastIndex, 그리고 일치하는 항목을 찾으면 lastIndex 속성을 일치 항목 바로 다음 문자의 위치 번호로 설정합니다.

템플릿 작성

정규식 패턴은 /abc/와 같은 일반 문자나 /ab*c/ 또는 /Chapter (\d+)\.\d*/와 같은 일반 문자와 특수 문자의 조합으로 구성됩니다. 마지막 예"메모리 메커니즘"으로 사용되는 괄호를 포함합니다. 템플릿의 이 부분과 일치하는 내용은 나중에 사용할 수 있도록 기억됩니다.

간단한 템플릿 사용

간단한 패턴은 텍스트에서 직접 일치하는 항목을 찾는 데 사용됩니다. 예를 들어, /abc/ 패턴은 'abc' 문자가 동일한 순서로 함께 나타나는 경우에만 문자열의 문자 조합과 일치합니다.

JavaScript의 RegExp 클래스는 정규식, 즉 문자 패턴을 설명하는 객체입니다. RegExp 개체는 일반적으로 아래에 제시된 특수 리터럴 구문을 사용하여 생성되지만 RegExp() 생성자를 사용하여 생성할 수도 있습니다.

구문 // 특수 리터럴 구문 사용 var regex = /pattern /flags ; // 생성자 사용 var regex = new RegExp("pattern ", "flags "); var regex = new RegExp(/pattern /, "flags ");

매개변수 값:

정규식 플래그 플래그 설명
g첫 번째 일치 이후에 중지하지 않고 모든 일치 항목을 찾을 수 있습니다( 글로벌 매치 플래그).
대소문자를 구분하지 않는 일치를 허용합니다( 케이스 플래그 무시).
일치는 여러 행에 걸쳐 수행됩니다. 선행 및 후행 문자(^ 및 $)는 여러 줄에 걸쳐 처리됩니다. 즉, 일치 항목은 전체 줄의 시작이나 끝뿐만 아니라 각 줄의 시작이나 끝(구분자 \n 또는 \r)에서 발생합니다( 여러 줄 플래그).
패턴은 유니코드 코드 포인트의 시퀀스로 해석됩니다( 유니코드 플래그).
와이이 정규식의 lastIndex 속성이 가리키는 인덱스에서 일치가 발생하지만 이후 또는 이전 인덱스에서는 일치가 수행되지 않습니다( 끈끈한 깃발).
문자 세트 메타문자 기호 설명
. 개행 또는 줄 끝 문자(\n, \r, \u2028 또는 \u2029) 이외의 단일 문자를 찾을 수 있습니다.
\디기본 라틴 알파벳에서 숫자 기호를 찾을 수 있습니다. 문자 집합을 사용하는 것과 동일합니다.
\디기본 라틴 알파벳에서 숫자가 아닌 모든 문자를 찾을 수 있습니다. 문자 세트 [^0-9]와 동일합니다.
\에스단일 공백 ​​문자를 찾을 수 있습니다. 공백은 공백, 탭, 페이지 피드, 줄 바꿈 및 기타 유니코드 공백 문자를 나타냅니다. 문자 집합 [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\ u200a​ \u2028\u2029​\u202f\u205f​\u3000].
\에스공백이 아닌 단일 문자를 찾을 수 있습니다. 공백은 공백, 탭, 페이지 피드, 줄 바꿈 및 기타 유니코드 공백 문자를 나타냅니다. 문자 집합 [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009 와 동일 \u200a ​\u2028\u2029​\u202f\u205f​\u3000].
[\비]백스페이스 문자(특수 문자 \b, U+0008)를 찾을 수 있습니다.
\0 기호 0(영)을 찾을 수 있습니다.
\N개행 문자를 찾을 수 있습니다.
\에프페이지 피드 문자를 찾을 수 있습니다.
\아르 자형캐리지 리턴 문자를 찾을 수 있습니다.
\티가로 탭 문자를 찾을 수 있습니다.
\V세로 탭 문자를 찾을 수 있습니다.
\w밑줄을 포함하여 기본 라틴 알파벳에서 모든 영숫자 문자를 찾을 수 있습니다. 문자 집합과 동일합니다.
\W기본 라틴 알파벳의 문자가 아닌 모든 문자를 찾을 수 있습니다. 문자 세트 [^a-Za-z0-9_]와 동일합니다.
\cX문자열에서 제어 문자를 찾을 수 있습니다. 여기서 X는 A부터 Z까지의 문자입니다. 예를 들어 /\cM/은 Ctrl-M 문자를 나타냅니다.
\xhh16진수 값(hh는 두 자리 16진수 값)을 사용하여 문자를 찾을 수 있습니다.
\어어어어UTF-16 인코딩을 사용하여 문자를 찾을 수 있습니다(hhhh는 4자리 16진수 값).
\u(hhhh) 또는
\u(아아아아아)
U+hhhh 또는 U+hhhhh(16진수 값)의 유니코드 값을 가진 문자를 찾을 수 있습니다. u 플래그가 주어진 경우에만.
\ 다음 문자는 특수 문자이므로 문자 그대로 해석하면 안 됨을 나타냅니다. 일반적으로 특수한 방식으로 해석되는 문자의 경우 다음 문자가 특수하지 않고 문자 그대로 해석되어야 함을 지정합니다.
제한 수량자 기호 설명
N*해당 문자가 0개 이상 포함된 문자열에서 일치가 발생합니다. N.
아니오하나 이상의 문자를 포함하는 문자열에서 일치가 발생합니다. N.
N?이전 요소가 있는 문자열에서 일치가 발생합니다. N 0번 또는 1번.
엔(엑스)일련의 문자를 포함하는 모든 문자열과 일치합니다. N특정 횟수 엑스. 엑스
엔(엑스,) 엑스이전 요소의 발생 N. 엑스양의 정수여야 합니다.
n(x, y)최소한 다음을 포함하는 모든 문자열과 일치합니다. 엑스, 그러나 그 이상은 아닙니다 와이이전 요소의 발생 N. 엑스그리고 와이양의 정수여야 합니다.
N*?
n+?
N??
엔(엑스)?
n(x,)?
n(x,y)?
비교는 수량자 *, +, ?와 유사하게 발생합니다. 그리고 (...) 그러나 검색은 가능한 최소한의 비교를 위한 것입니다. 기본값은 "탐욕스러운" 모드입니다. 수량자 끝에서 비교가 가능한 최소 횟수만큼 반복되는 "비탐욕" 모드를 설정할 수 있습니다.
x(?=y)비교할 수 있게 해줍니다 엑스, 경우에만 엑스~해야 한다 와이.
x(?!y)비교할 수 있게 해줍니다 엑스, 경우에만 엑스하지마 와이.
x|y지정된 대체 항목을 사용하여 비교가 발생합니다.
그룹화 및 백링크 기호 설명
(엑스)기호를 찾을 수 있습니다. 엑스비교 결과를 기억합니다("괄호 캡처"). 일치하는 부분 문자열은 결과 배열 요소 ..., [n] 또는 미리 정의된 RegExp 개체 $1 ..., $9의 속성에서 호출될 수 있습니다.
(?:엑스)기호를 찾을 수 있습니다. 엑스, 그러나 일치 결과("비캡처 괄호")는 기억하지 않습니다. 일치하는 하위 문자열은 결과 배열 요소 ..., [n] 또는 미리 정의된 RegExp 개체 $1 ..., $9의 속성에서 호출할 수 없습니다.
\N정규식에서 괄호 안의 n번째 문자열과 일치하는 마지막 부분 문자열에 대한 반환 참조입니다(괄호 번호는 왼쪽에서 오른쪽으로 지정됩니다). N양의 정수여야 합니다.

어떤 사람들은 문제에 직면했을 때 “아, 정규식을 사용하겠습니다.”라고 생각합니다. 이제 그들은 두 가지 문제를 안고 있습니다.
제이미 자윈스키

위안마는 “나무결을 가로질러 나무를 자르려면 많은 힘이 필요하다. 문제 구조 전반에 걸쳐 프로그래밍하려면 많은 코드가 필요합니다.
위안마 스승님, “프로그래밍 책”

프로그래밍 도구와 기술은 혼란스러운 진화 방식으로 생존하고 확산됩니다. 때로는 아름답고 눈부신 기술이 살아남는 것이 아니라 단순히 해당 분야에서 충분히 잘 작동하는 기술이 살아남는 경우도 있습니다. 예를 들어 다른 성공적인 기술에 통합되는 경우입니다.

이 장에서는 이러한 도구인 정규 표현식에 대해 설명합니다. 이는 문자열 데이터의 패턴을 설명하는 방법입니다. 그들은 JavaScript와 기타 여러 언어 및 도구에 포함된 작은 독립형 언어를 만듭니다.

정규 일정은 매우 이상하면서도 매우 유용합니다. 그들의 구문은 비밀스럽고 JavaScript 프로그래밍 인터페이스는 투박합니다. 그러나 이는 문자열을 탐색하고 조작하기 위한 강력한 도구입니다. 일단 이해하고 나면, 당신은 더욱 효과적인 프로그래머가 될 것입니다.

정규식 정규 – 개체 유형을 만듭니다. RegExp 생성자를 호출하거나 원하는 템플릿을 슬래시로 묶어 작성하여 만들 수 있습니다.

Var re1 = new RegExp("abc"); var re2 = /abc/;

두 정규식은 모두 동일한 패턴을 나타냅니다. 문자 "a", 문자 "b", 문자 "c" 순입니다.

RegExp 생성자를 사용하면 패턴이 일반 문자열로 작성되므로 백슬래시와 관련된 모든 규칙이 적용됩니다.

패턴이 슬래시 사이에 있는 두 번째 항목은 백슬래시를 다르게 처리합니다. 먼저, 패턴이 슬래시로 끝나기 때문에 패턴에 포함하려는 슬래시 앞에 백슬래시를 넣어야 합니다. 또한 \n과 같은 특수 문자의 일부가 아닌 백슬래시는 (문자열에서 무시되지 않고) 유지되며 패턴의 의미를 변경합니다. 물음표나 더하기 같은 일부 문자는 정규 표현식에서 특별한 의미를 가지며, 이러한 문자를 일치시켜야 하는 경우 앞에 백슬래시를 추가해야 합니다.

Var sixteenPlus = /eighteen\+/;

어떤 문자 앞에 슬래시가 와야 하는지 알려면 정규 표현식의 모든 특수 문자 목록을 알아야 합니다. 이는 아직 가능하지 않으므로 확실하지 않은 경우 문자, 숫자 또는 공백이 아닌 문자 앞에 백슬래시를 넣으세요.

일치 확인 일반 엔진에는 여러 가지 방법이 있습니다. 가장 간단한 것은 테스트입니다. 문자열을 전달하면 문자열에 지정된 패턴이 포함되어 있는지 여부를 나타내는 부울 값이 반환됩니다.

Console.log(/abc/.test("abcde")); // → 참 console.log(/abc/.test("abxde")); // → 거짓

특수 문자가 아닌 문자로만 구성된 일반 시퀀스는 단순히 이러한 문자의 시퀀스입니다. abc가 테스트 중인 줄의 시작 부분뿐만 아니라 어디에든 있으면 test는 true를 반환합니다.

문자 집합 찾기 indexOf를 사용하면 문자열에 abc가 포함되어 있는지 확인할 수도 있습니다. 일반 패턴을 사용하면 더 나아가 더 복잡한 패턴을 만들 수 있습니다.

숫자를 찾아야 한다고 가정해 보겠습니다. 정규식에서 대괄호 안에 문자 집합을 넣으면 표현식의 해당 부분이 대괄호 안의 문자와 일치한다는 의미입니다.

두 표현식 모두 숫자가 포함된 줄에 있습니다.

Console.log(//.test("1992년")); // → true console.log(//.test("1992년")); // → 사실

대괄호에서 두 문자 사이의 대시는 문자 범위를 지정하는 데 사용되며, 여기서 시퀀스는 유니코드 인코딩으로 지정됩니다. 0부터 9까지의 문자가 한 행에(코드 48부터 57까지) 있으므로 모두 캡처하여 모든 숫자와 일치합니다.

여러 문자 그룹에는 고유한 기본 제공 약어가 있습니다.

\d 임의의 숫자
\w 영숫자 문자
\s 공백 문자(공백, 탭, 개행 등)
\D 숫자가 아닙니다
\W는 영숫자가 아닙니다.
\S는 공백 문자가 아닙니다.
. 줄 바꿈을 제외한 모든 문자

따라서 다음 표현식을 사용하여 01/30/2003 15:20과 같은 날짜 및 시간 형식을 설정할 수 있습니다.

Var dateTime = /\d\d-\d\d-\d\d\d\d \d\d:\d\d/; console.log(dateTime.test("30-01-2003 15:20")); // → true console.log(dateTime.test("30-Jan-2003 15:20")); // → 거짓

정말 끔찍해 보이지 않나요? 백슬래시가 너무 많아 패턴을 이해하기 어렵습니다. 나중에 조금 더 개선해 보겠습니다.

백슬래시는 대괄호 안에도 사용할 수 있습니다. 예를 들어, [\d.]는 숫자나 마침표를 의미합니다. 대괄호 안의 마침표는 특별한 의미를 잃고 단순히 마침표가 됩니다. +와 같은 다른 특수 문자에도 동일하게 적용됩니다.

여는 대괄호 바로 뒤에 ^ 기호를 배치하여 문자 집합을 반전시킬 수 있습니다. 즉, 집합에 있는 문자를 제외한 모든 문자를 찾아야 한다고 가정할 수 있습니다.

Var notBinary = /[^01]/; console.log(notBinary.test("1100100010100110")); // → 거짓 console.log(notBinary.test("1100100010200110")); // → 사실

패턴의 반복 부분 우리는 하나의 숫자를 찾는 방법을 알고 있습니다. 정수, 즉 하나 이상의 숫자로 구성된 일련의 숫자를 찾아야 한다면 어떻게 될까요?

정규 순서에서 어떤 항목 뒤에 + 기호를 넣으면 해당 요소가 두 번 이상 반복될 수 있음을 의미합니다. /\d+/는 하나 이상의 숫자를 의미합니다.

Console.log(/"\d+"/.test(""123"")); // → true console.log(/"\d+"/.test("""")); // → 거짓 console.log(/"\d*"/.test(""123"")); // → true console.log(/"\d*"/.test("""")); // → 사실

별표 *는 거의 동일한 의미를 갖지만 패턴이 0회 발생하도록 허용합니다. 뒤에 별표가 붙는다면 패턴이 줄에 있는 것을 막지 못합니다. 단지 거기에 0번만 나타날 뿐입니다.

물음표는 패턴의 일부를 선택 사항으로 만듭니다. 즉, 해당 패턴이 0번 또는 1번 발생할 수 있음을 의미합니다. 다음 예에서는 u 문자가 나타날 수 있지만 그렇지 않은 경우에도 패턴이 일치합니다.

Var 이웃 = /neighbou?r/; console.log(neighbor.test("이웃")); // → 참 console.log(neighbor.test("neighbor")); // → 사실

중괄호는 패턴이 발생해야 하는 정확한 횟수를 지정하는 데 사용됩니다. (4) 요소 뒤는 해당 요소가 한 줄에 4번 나타나야 함을 의미합니다. 간격을 지정할 수도 있습니다. (2,4)는 요소가 2회 이상 4회 이하로 발생해야 함을 의미합니다.

날짜 및 시간 형식의 또 다른 버전으로, 한 자리 또는 두 자리의 일, 월, 시간이 허용됩니다. 그리고 조금 더 읽기 쉽습니다.

Var dateTime = /\d(1,2)-\d(1,2)-\d(4) \d(1,2):\d(2)/; console.log(dateTime.test("30-1-2003 8:45")); // → 사실

숫자 중 하나를 생략하면 개방형 공간을 사용할 수 있습니다. (,5,)는 패턴이 0번에서 5번까지 발생할 수 있음을 의미하고, (5,)는 5번 이상 발생할 수 있음을 의미합니다.

하위 표현식 그룹화 여러 요소에 대해 * 또는 + 연산자를 한 번에 사용하려면 괄호를 사용할 수 있습니다. 대괄호로 묶인 정규식 부분은 연산자의 관점에서 하나의 요소로 간주됩니다.

Var CartoonCrying = /boo+(hoo+)+/i; console.log(phantomCrying.test("Boohoooohoohoooo")); // → 사실

첫 번째와 두 번째 플러스는 boo와 hoo의 두 번째 o에만 적용됩니다. 세 번째 +는 하나 이상의 해당 시퀀스를 찾는 전체 그룹(hoo+)을 나타냅니다.

표현식 끝에 있는 문자 i는 정규식에서 대소문자를 구분하지 않게 하여 B가 b와 일치하도록 합니다.

일치 및 그룹 테스트 방법은 정규식을 확인하는 가장 간단한 방법입니다. 일치하는 항목이 발견되었는지 여부만 알려줍니다. 정규식에는 아무것도 발견되지 않으면 null을 반환하고 그렇지 않으면 일치 항목에 대한 정보가 포함된 개체를 반환하는 exec 메서드도 있습니다.

Var match = /\d+/.exec("one two 100"); console.log(일치); // → ["100"] console.log(match.index); // → 8

exec가 반환한 객체에는 일치 항목이 발생한 문자의 번호가 포함된 index 속성이 있습니다. 일반적으로 개체는 문자열 배열처럼 보입니다. 여기서 첫 번째 요소는 일치 여부가 확인된 문자열입니다. 이 예에서는 이것이 우리가 찾고 있던 일련의 숫자가 될 것입니다.

문자열에는 거의 동일한 방식으로 작동하는 match 메서드가 있습니다.

Console.log("하나 둘 100".match(/\d+/)); // → ["100"]

정규식에 괄호로 그룹화된 하위 표현식이 포함된 경우 이러한 그룹과 일치하는 텍스트도 배열에 나타납니다. 첫 번째 요소는 항상 완전히 일치합니다. 두 번째는 첫 번째 그룹(괄호가 먼저 발생한 그룹)과 일치한 부분이고 그 다음은 두 번째 그룹 등입니다.

Var quotedText = /"([^"]*)"/; console.log(quotedText.exec("she had "hello"")); // → [""hello"", "hello"]

그룹을 전혀 찾을 수 없는 경우(예: 그룹 뒤에 물음표가 오는 경우) 배열에서 해당 위치는 정의되지 않습니다. 그룹이 여러 번 일치하는 경우 마지막 일치 항목만 배열에 포함됩니다.

Console.log(/bad(ly)?/.exec("bad")); // → ["나쁜", 정의되지 않음] console.log(/(\d)+/.exec("123")); // → ["123", "3"]

그룹은 문자열의 일부를 검색하는 데 유용합니다. 문자열에 날짜가 있는지 확인하는 것이 아니라 이를 추출하여 날짜를 나타내는 객체를 생성하려는 경우 일련의 숫자를 괄호로 묶고 exec 결과에서 날짜를 선택할 수 있습니다.

하지만 먼저 JavaScript에서 날짜와 시간을 저장하는 기본 방법을 배우는 약간의 여담이 있습니다.

날짜 유형 JavaScript에는 날짜, 특히 특정 시점에 대한 표준 객체 유형이 있습니다. 데이트라고 합니다. new를 사용하여 단순히 날짜 객체를 생성하면 현재 날짜와 시간을 얻게 됩니다.

Console.log(새 날짜()); // → 2014년 11월 9일 일요일 00:07:57 GMT+0300 (CET)

주어진 시간을 포함하는 객체를 생성할 수도 있습니다.

Console.log(새 날짜(2015, 9, 21)); // → 2015년 10월 21일 수요일 00:00:00 GMT+0300 (CET) console.log(new Date(2009, 11, 9, 12, 59, 59, 999)); // → 2009년 12월 9일 수요일 12:59:59 GMT+0300 (CET)

JavaScript는 월 번호가 0으로 시작하고 일 번호가 1로 시작하는 규칙을 사용합니다. 이것은 어리 석고 우스꽝 스럽습니다. 조심하세요.

마지막 4개의 인수(시, 분, 초, 밀리초)는 선택 사항이며 누락된 경우 0으로 설정됩니다.

타임스탬프는 1970년이 시작된 이후 경과한 밀리초 단위로 저장됩니다. 1970년 이전에는 음수가 사용되었습니다(이는 그 당시에 만들어진 Unix 시간 규칙 때문입니다). 날짜 객체의 getTime 메소드는 이 숫자를 반환합니다. 당연히 크죠.
console.log(new Date(2013, 11, 19).getTime()); // → 1387407600000 console.log(새 날짜(1387407600000)); // → 2013년 12월 19일 목요일 00:00:00 GMT+0100 (CET)

Date 생성자에 하나의 인수를 제공하면 이 숫자(밀리초)로 처리됩니다. Date 객체를 생성하고 getTime 메서드를 호출하거나 Date.now 함수를 호출하여 현재 밀리초 값을 얻을 수 있습니다.

Date 객체에는 해당 구성 요소를 검색하기 위한 getFullYear, getMonth, getDate, getHours, getMinutes 및 getSeconds 메소드가 있습니다. 93이나 14와 같이 다소 쓸모없는 두 자리 코드를 반환하는 getYear 메서드도 있습니다.

템플릿의 관련 부분을 괄호로 묶어 문자열에서 직접 날짜 개체를 만들 수 있습니다.

함수 findDate(string) ( var dateTime = /(\d(1,2))-(\d(1,2))-(\d(4))/; var match = dateTime.exec(string); return new Date(숫자(일치), 숫자(일치) - 1, 숫자(일치) ) console.log(findDate("30-1-2003")); // → 2003년 1월 30일 목요일 00:00:00 GMT+0100 (CET)

단어 및 문자열 경계 불행히도 findDate는 문자열 "100-1-30000"에서 의미 없는 날짜 00-1-3000을 추출합니다. 일치는 문자열의 어느 곳에서나 발생할 수 있으므로 이 경우단순히 두 번째 문자부터 시작하여 두 번째 문자부터 마지막 ​​문자까지 끝납니다.

전체 문자열을 일치시키려면 ^ 및 $ 태그를 사용합니다. ^는 줄의 시작과 일치하고 $는 끝과 일치합니다. 따라서 /^\d+$/는 하나 이상의 숫자만 포함하는 문자열과 일치하고, /^!/는 느낌표로 시작하는 문자열과 일치하며, /x^/는 어떤 문자열과도 일치하지 않습니다(x는 있을 수 없음).

반면에 날짜가 단어 경계에서 시작하고 끝나는지 확인하려면 \b 표시를 사용합니다. 단어 경계는 줄의 시작이나 끝일 수도 있고, 한쪽에는 영숫자 문자 \w가 있고 다른 쪽에는 영숫자가 아닌 문자가 있는 줄의 모든 위치일 수 있습니다.

Console.log(/cat/.test("연결")); // → true console.log(/\bcat\b/.test("concatenate")); // → 거짓

경계 레이블은 기호가 아닙니다. 이는 단순히 제약 조건입니다. 즉, 특정 조건이 충족되는 경우에만 일치가 발생한다는 의미입니다.

선택 가능한 패턴 텍스트에 숫자만 포함되어 있지 않고 숫자 뒤에 단수형 또는 복수형으로 돼지, 소, 닭이 포함되어 있는지 확인하고 싶다고 가정해 보겠습니다.

세 가지 정규식을 작성하여 하나씩 확인하는 것도 가능하지만 더 좋은 방법이 있습니다. 기호 | 왼쪽과 오른쪽에 있는 패턴 중에서 하나를 선택하는 것을 나타냅니다. 그리고 우리는 다음과 같이 말할 수 있습니다.

Var AnimalCount = /\b\d+ (돼지|소|닭)s?\b/; console.log(animalCount.test("돼지 15마리")); // → true console.log(animalCount.test("15 pigchickens")); // → 거짓

괄호는 |가 적용되는 패턴 부분을 구분하며, 이러한 많은 연산자는 두 개 이상의 옵션 중에서 선택했음을 나타내기 위해 하나씩 배치될 수 있습니다.

검색 엔진 정규식은 순서도라고 생각할 수 있습니다. 다음 다이어그램은 최근 가축 사례를 설명합니다.

다이어그램의 왼쪽에서 오른쪽으로 경로를 찾을 수 있는 경우 표현식은 문자열과 일치합니다. 우리는 줄의 현재 위치를 기억하고 직사각형을 통과할 때마다 위치 바로 뒤의 줄 부분이 직사각형의 내용과 일치하는지 확인합니다.

이는 순서도를 진행할 때 "the 3 pigs"라는 문자열에서 일반 문자가 일치하는지 확인하는 방법이 다음과 같다는 것을 의미합니다.

위치 4에는 단어 경계가 있으며 첫 번째 직사각형을 전달합니다.
- 네 번째 위치부터 숫자를 찾고 두 번째 직사각형을 통과합니다.
- 위치 5에서 한 경로는 두 번째 직사각형 앞에서 닫히고 두 번째 경로는 공백이 있는 직사각형으로 더 멀리 이동합니다. 숫자가 아닌 공백이 있으므로 두 번째 경로를 선택합니다.
- 이제 우리는 "pigs"의 시작이자 경로의 삼중 분기인 위치 6에 있습니다. 줄에 "소"나 "닭"은 없지만 "돼지"가 있으므로 이 길을 선택합니다.
- 삼중 분기 이후 위치 9에서 한 경로는 "s"를 우회하여 마지막 단어 경계 직사각형으로 이동하고 두 번째 경로는 "s"를 통과합니다. "s"가 있으므로 거기로 이동합니다.
- 위치 10에서는 줄의 끝에 있으며 단어 경계만 일치할 수 있습니다. 선의 끝은 경계로 간주되며 마지막 직사각형을 통과합니다. 이제 우리는 템플릿을 성공적으로 찾았습니다.

기본적으로 정규식이 작동하는 방식은 알고리즘이 문자열의 시작 부분에서 시작하여 거기서 일치하는 항목을 찾으려고 시도하는 것입니다. 우리의 경우 단어 경계가 있으므로 첫 번째 직사각형을 통과하지만 거기에 숫자가 없으므로 두 번째 직사각형에서 넘어집니다. 그런 다음 문자열의 두 번째 문자로 이동하고 거기에서 일치하는 항목을 찾으려고 시도합니다. 일치하는 항목을 찾거나 문자열 끝에 도달할 때까지 계속됩니다. 이 경우 일치하는 항목이 없습니다.

롤백 일반 /\b(+b|\d+|[\da-f]h)\b/는 b가 뒤에 오는 2진수, 접미사가 없는 10진수 또는 16진수(숫자 0~9 또는 문자 a ~ h), 그 뒤에 h가 옵니다. 관련 다이어그램:

일치하는 항목을 검색할 때 문자열에 해당 숫자가 없더라도 알고리즘이 최상위 경로(이진수)를 사용하는 경우가 있습니다. 예를 들어 "103" 줄이 있는 경우 숫자 3에 도달한 후에야 알고리즘이 잘못된 경로에 있음을 이해하게 됩니다. 일반적으로 이 줄은 일반 순서와 일치하지만 이 스레드에서는 일치하지 않습니다.

그런 다음 알고리즘이 롤백됩니다. 분기에서는 선택한 경로가 작동하지 않는 경우 다시 돌아가서 다른 경로를 시도할 수 있도록 현재 위치(우리의 경우 이는 단어 경계 바로 뒤의 줄의 시작 부분)를 기억합니다. 문자열 "103"의 경우 3을 만난 후 다시 돌아가서 10진수 경로를 통과하려고 시도합니다. 그러면 일치하는 항목이 발견됩니다.

알고리즘은 완전한 일치 항목을 찾는 즉시 중지됩니다. 이는 여러 옵션이 적합하더라도 그 중 하나만 사용된다는 의미입니다(정규 순서에 나타나는 순서대로).

역추적은 +, * 등의 반복 연산자를 사용할 때 발생합니다. "abcxe" 문자열에서 /^.*x/를 검색하면 정규식 부분.*이 전체 문자열을 사용하려고 시도합니다. 그러면 알고리즘은 "x"도 필요하다는 것을 깨닫게 됩니다. 문자열 끝 뒤에 "x"가 없기 때문에 알고리즘은 한 문자 뒤로 이동하여 일치하는 항목을 찾으려고 시도합니다. abcx 뒤에도 x가 없으며 이번에는 하위 문자열 abc로 다시 롤백됩니다. 그리고 줄 뒤에서 x를 찾아 0~4번째 위치에서 성공적인 일치를 보고합니다.

여러 롤백으로 이어지는 일반 루틴을 작성할 수 있습니다. 이 문제는 패턴이 다양한 방식으로 입력과 일치할 수 있을 때 발생합니다. 예를 들어, 이진수에 대한 정규식을 작성할 때 실수를 하면 실수로 /(+)+b/와 같은 내용을 작성할 수 있습니다.

알고리즘이 끝에 "b"가 없는 긴 0과 1 문자열에서 이러한 패턴을 찾는 경우 먼저 숫자가 부족할 때까지 내부 루프를 통과합니다. 그런 다음 그는 끝에 "b"가 없다는 것을 알게 될 것입니다. 그는 한 위치로 롤백하고 외부 루프를 통과하고 다시 포기하고 내부 루프를 따라 다른 위치로 롤백하려고 시도합니다... 그리고 그는 계속할 것입니다. 두 루프를 모두 사용하여 이런 방식으로 검색합니다. 즉, 줄의 각 문자에 대한 작업량이 두 배가 됩니다. 수십 개의 문자라도 일치하는 항목을 찾는 데 매우 오랜 시간이 걸립니다.

바꾸기 메서드 문자열에는 문자열의 일부를 다른 문자열로 바꿀 수 있는 바꾸기 메서드가 있습니다.

Console.log("아빠".replace("p", "m")); // → 지도

첫 번째 인수는 정규식일 수도 있으며, 이 경우 해당 줄에서 처음 나타나는 정규식이 대체됩니다. "g"(전역) 옵션이 정규식에 추가되면 첫 번째 항목뿐만 아니라 모든 항목이 대체됩니다.

Console.log("보로부두르".replace(//, "a")); // → 바로부두르 console.log("보로부두르".replace(//g, "a")); // → 바라바다르

별도의 인수나 replacementAll과 같은 별도의 메서드를 통해 "모두 교체" 옵션을 전달하는 것이 합리적입니다. 그러나 불행히도 옵션은 일반 시스템 자체를 통해 전송됩니다.

정규식에 지정된 문자열에서 찾은 그룹에 대한 링크를 사용할 때 정규식의 모든 기능이 드러납니다. 예를 들어, "성, 이름" 형식으로 한 줄에 하나의 이름으로 사람 이름이 포함된 줄이 있습니다. "이름 성"을 얻기 위해 이들을 바꾸고 쉼표를 제거해야 하는 경우 다음과 같이 작성합니다.

Console.log("호퍼, 그레이스\n매카시, 존\n리치, 데니스" .replace(/([\w ]+), ([\w ]+)/g, "$2 $1")); // → 그레이스 호퍼 // 존 매카시 // 데니스 리치

대체 줄의 $1 및 $2는 괄호로 묶인 문자 그룹을 나타냅니다. $1은 첫 번째 그룹과 일치하는 텍스트로 대체되고, $2는 두 번째 그룹으로 대체되는 식으로 최대 $9까지 대체됩니다. 전체 일치 항목은 $& 변수에 포함됩니다.

두 번째 인수로 함수를 전달할 수도 있습니다. 각 교체에 대해 발견된 그룹(및 문자열의 전체 일치 부분)이 인수가 되는 함수가 호출되고 해당 결과가 새 줄에 삽입됩니다.

간단한 예:

Var s = "CIA와 FBI"; console.log(s.replace(/\b(fbi|cia)\b/g, function(str) ( return str.toUpperCase(); ))); // → CIA와 FBI

더 흥미로운 것은 다음과 같습니다.

Var stock = "레몬 1개, 양배추 2개, 계란 101개"; function minusOne(match, amount, unit) ( amount = Number(amount) - 1; if (amount == 1) // 하나만 남으면 끝에서 "s"를 제거하십시오. 길이 - 1); else if (금액 == 0) 금액 = "아니요"; 반환 금액 + " " + 단위 ) console.log(stock.replace(/(\d+) (\w+)/g, minusOne) ); // → 레몬 없음, 양배추 1개, 계란 100개

이 코드는 문자열을 사용하여 숫자 뒤에 단어가 나오는 모든 항목을 찾아 각 숫자를 1씩 줄여서 문자열을 반환합니다.

그룹 (\d+)은 amount 인수에 들어가고 (\w+)는 단위 인수에 들어갑니다. 이 함수는 금액을 숫자로 변환합니다. 패턴은 \d+이기 때문에 항상 작동합니다. 그런 다음 항목이 1개만 남아 있는 경우 단어를 변경합니다.

욕심 JavaScript 코드에서 모든 주석을 제거하는 함수를 작성하기 위해 바꾸기를 사용하는 것은 쉽습니다. 첫 번째 시도는 다음과 같습니다.

함수 StripComments(code) ( return code.replace(/\/\/.*|\/\*[^]*\*\//g, ""); ) console.log(stripComments("1 + /* 2 */3")); // → 1 + 3 console.log(stripComments("x = 10;// ten!")); // → x = 10; console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 1

"or" 연산자 앞 부분은 두 개의 슬래시와 개행 문자를 제외한 모든 문자가 뒤따르는 부분과 일치합니다. 여러 줄 주석을 제거하는 부분은 더 복잡합니다. 우리는 [^]를 사용합니다. 어떤 문자를 찾는 방법으로 비어 있지 않은 문자. 블록 주석이 새 줄에 계속되고 개행 문자가 마침표와 일치하지 않기 때문에 마침표를 사용할 수 없습니다.

그러나 이전 예제의 출력은 올바르지 않습니다. 왜?

[^]* 부분은 먼저 가능한 한 많은 문자를 캡처하려고 시도합니다. 이로 인해 일반 시퀀스의 다음 부분에서 일치하는 항목을 찾지 못하면 한 문자를 롤백하고 다시 시도합니다. 이 예에서 알고리즘은 전체 라인을 포착하려고 시도한 다음 롤백됩니다. 4자를 롤백한 후 그는 해당 줄에서 */를 찾을 것입니다. 이는 우리가 원하는 것이 아닙니다. 우리는 단 하나의 댓글만 가져오고 싶었고 줄 끝으로 가서 마지막 댓글을 찾는 것이 아니었습니다.

이 때문에 반복 연산자(+, *, ? 및 ())가 탐욕적이라고 말합니다. 즉, 먼저 최대한 많이 잡은 다음 다시 돌아갑니다. 이와 같은 연산자(+?, *?, ??, ()?) 뒤에 질문을 넣으면 욕심이 없어져 가능한 가장 작은 발생을 찾기 시작합니다.

그리고 그것이 우리에게 필요한 것입니다. 별표가 한 줄에서 가능한 최소 문자 수로 일치하는 항목을 찾도록 함으로써 주석 블록을 하나만 소비하고 그 이상은 소비하지 않습니다.

함수 StripComments(code) ( return code.replace(/\/\/.*|\/\*[^]*?\*\//g, ""); ) console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 + 1

욕심이 없는 연산자 대신 욕심 많은 연산자를 사용하면 많은 오류가 발생합니다. 반복 연산자를 사용할 때는 항상 탐욕스럽지 않은 연산자를 먼저 고려하십시오.

RegExp 객체를 동적으로 생성하기 어떤 경우에는 코드가 작성될 때 정확한 패턴을 알 수 없습니다. 예를 들어 텍스트에서 사용자 이름을 찾아 밑줄로 묶어야 합니다. 프로그램을 실행해야만 이름을 알 수 있으므로 슬래시 표기법을 사용할 수 없습니다.

그러나 문자열을 구성하고 RegExp 생성자를 사용할 수 있습니다. 예는 다음과 같습니다.

변수 이름 = "해리"; var text = "그리고 해리는 이마에 흉터가 있어요."; var regexp = new RegExp("\\b(" + 이름 + ")\\b", "gi"); console.log(text.replace(regexp, "_$1_")); // → 그리고 _Harry_는 이마에 흉터가 있습니다.

단어 경계를 만들 때 이중 슬래시를 사용해야 합니다. 왜냐하면 슬래시를 사용한 일반적인 순서가 아닌 일반 줄에 작성하기 때문입니다. RegExp의 두 번째 인수에는 정규 표현식에 대한 옵션이 포함되어 있습니다. 이 경우에는 "gi"입니다. 전역적이고 대소문자를 구분하지 않습니다.

하지만 이름이 "dea+hlrd"(사용자가 쿨하츠커인 경우)라면 어떻게 될까요? 결과적으로 문자열에서 일치하는 항목을 찾지 못하는 의미 없는 정규식을 얻게 됩니다.

마음에 들지 않는 문자 앞에 백슬래시를 추가할 수 있습니다. \b 또는 \n은 특수 문자이므로 문자 앞에 백슬래시를 추가할 수 없습니다. 그러나 영숫자가 아닌 문자 앞에는 문제 없이 슬래시를 추가할 수 있습니다.

변수 이름 = "dea+hlrd"; var text = "이 dea+hlrd는 모두를 짜증나게 합니다."; var escaped = name.replace(/[^\w\s]/g, "\\$&"); var regexp = new RegExp("\\b(" + escaped + ")\\b", "gi"); console.log(text.replace(regexp, "_$1_")); // → 이 _dea+hlrd_는 모두를 짜증나게 했습니다.

검색 방법 indexOf 방법은 정규식과 함께 사용할 수 없습니다. 그러나 정규식만을 기대하는 검색 방법이 있습니다. indexOf와 마찬가지로 처음 발생하는 인덱스를 반환하고, 아무 것도 발생하지 않으면 -1을 반환합니다.

Console.log("단어".search(/\S/)); // → 2 console.log(" ".search(/\S/)); // → -1

안타깝게도 (indexOf에서처럼) 특정 오프셋에서 시작하여 일치하는 항목을 찾도록 메서드에 지시할 수 있는 방법은 없습니다. 도움이 될 것입니다.

lastIndex 속성 exec 메소드는 문자열의 특정 위치에서 검색을 시작하는 편리한 방법도 제공하지 않습니다. 하지만 불편한 방법을 제공합니다.

정규식 개체에는 속성이 있습니다. 그 중 하나는 문자열을 포함하는 소스입니다. 또 다른 하나는 lastIndex로, 일부 조건에서 다음 발생 검색이 시작되는 위치를 제어합니다.

이러한 조건에는 전역 옵션 g가 있어야 하고 검색이 exec 메소드를 사용하여 수행되어야 한다는 것이 포함됩니다. 보다 합리적인 해결책은 단순히 추가 인수를 exec에 전달하도록 허용하는 것입니다. 그러나 합리성은 JavaScript 정규식 인터페이스의 기본 기능이 아닙니다.

Var 패턴 = /y/g; 패턴.라스트인덱스 = 3; var match = 패턴.exec("xyzzy"); console.log(match.index); // → 4 console.log(pattern.lastIndex); // → 5

검색이 성공하면 exec 호출은 발견된 항목 이후의 위치를 ​​가리키도록 lastIndex 속성을 업데이트합니다. 성공하지 못한 경우 lastIndex는 새로 생성된 객체의 lastIndex와 마찬가지로 0으로 설정됩니다.

전역 일반 변수와 여러 exec 호출을 사용하는 경우 이러한 자동 lastIndex 업데이트로 인해 문제가 발생할 수 있습니다. 일반 서버는 이전 호출에서 왼쪽 위치부터 검색을 시작할 수 있습니다.

변수 숫자 = /\d/g; console.log(digit.exec("여기는 1입니다.")); // → ["1"] console.log(digit.exec("and now: 1")); // → 널

g 옵션의 또 다른 흥미로운 효과는 일치 방법의 작동 방식을 변경한다는 것입니다. 이 옵션과 함께 호출하면 exec 결과와 유사한 배열을 반환하는 대신 문자열에서 패턴의 모든 항목을 찾아 찾은 하위 문자열의 배열을 반환합니다.

Console.log("바나나".match(/an/g)); // → ["an", "an"]

따라서 전역 일반 변수에 주의하세요. 필요한 경우(호출을 교체하거나 특별히 lastIndex를 사용하는 장소)는 아마도 모두 사용해야 하는 경우일 것입니다.

발생주기

일반적인 작업은 문자열에서 패턴의 모든 발생을 반복하여 lastIndex 및 exec를 사용하여 루프 본문의 일치 개체에 액세스할 수 있도록 하는 것입니다.

Var input = "3개의 숫자가 포함된 줄... 42와 88."; var 번호 = /\b(\d+)\b/g; var 일치; while (match = number.exec(input)) console.log("Found ", match, " on ", match.index); // → 14로 3을 찾았습니다 // 33으로 42를 찾았습니다 // 40으로 88을 찾았습니다

이는 할당 값이 할당되는 값이라는 사실을 활용합니다. while 루프의 조건으로 match = re.exec(input)을 사용하여 각 반복의 시작 부분에서 검색하고 결과를 변수에 저장한 다음 모든 일치 항목이 발견되면 루프를 종료합니다.

INI 파일 구문 분석

이 장을 마무리하기 위해 정규식을 사용하여 문제를 살펴보겠습니다. 인터넷을 통해 적에 대한 정보를 자동으로 수집하는 프로그램을 작성한다고 상상해 보십시오. (우리는 전체 프로그램을 작성하지 않고 설정 파일을 읽는 부분만 작성할 것입니다. 죄송합니다.) 파일은 다음과 같습니다.

Searchengine=http://www.google.com/search?q=$1 악의=9.7 ; 주석 앞에는 세미콜론이 배치됩니다. 각 섹션은 다른 적을 나타냅니다. fullname=Larry Doe type=kindergarten Bull website=http://www.geocities.com/CapeCanaveral/11451 fullname=Gargamel type=evil Wizard outputdir=/home/marijn/enemies/gargamel

정확한 파일 형식(매우 널리 사용되며 일반적으로 INI라고 함)은 다음과 같습니다.

빈 줄과 세미콜론으로 시작하는 줄은 무시됩니다.
- 대괄호로 묶인 줄은 새 섹션을 시작합니다.
- 영숫자 식별자가 포함된 줄 뒤에 = 이 섹션에 설정을 추가합니다.

그 밖의 모든 것은 잘못된 데이터입니다.

우리의 임무는 이러한 문자열을 각각 이름 속성과 설정 배열을 포함하는 개체 배열로 변환하는 것입니다. 각 섹션에는 하나의 개체가 필요하고 파일 상단의 전역 설정에는 다른 개체가 필요합니다.

파일을 한 줄씩 구문 분석해야 하므로 파일을 여러 줄로 나누어 시작하는 것이 좋습니다. 이를 위해 6장에서 string.split("\n")을 사용했습니다. 일부 운영 체제에서는 줄 바꿈에 하나의 \n 문자가 아닌 두 개의 \r\n 문자를 사용합니다. 분할 방법은 정규식을 인수로 사용하므로 /\r?\n/ 표현식을 사용하여 줄을 분할할 수 있으며, 줄 사이에 단일 \n과 \r\n을 모두 허용합니다.

Function parseINI(string) ( // 최상위 설정을 포함하는 객체로 시작해 보겠습니다. var currentSection = (name: null, fields: ); var 카테고리 = ; string.split(/\r?\n/).forEach(function (line ) ( var match; if (/^\s*(;.*)?$/.test(line)) ( return; ) else if (match = line.match(/^\[(.*)\ ]$ /)) ( currentSection = (이름: match, fields: ); 카테고리.push(currentSection); ) else if (match = line.match(/^(\w+)=(.*)$/)) ( currentSection.fields.push((이름: 일치, 값: 일치)); else ( throw new Error("The line "" + line + ""에 잘못된 데이터가 포함되어 있습니다."); ) ));

코드는 모든 행을 통과하여 현재 섹션 개체 "현재 섹션"을 업데이트합니다. 먼저 정규식 /^\s*(;.*)?$/를 사용하여 해당 행을 무시할 수 있는지 확인합니다. 이것이 어떻게 작동하는지 상상할 수 있습니까? 괄호 안의 부분이 댓글과 일치하는지요? 일반 문자도 공백으로만 구성된 줄과 일치하도록 만듭니다.

행이 주석이 아닌 경우 코드는 새 섹션이 시작되는지 확인합니다. 그렇다면 현재 섹션에 대한 새 개체가 생성되고 후속 설정이 추가됩니다.

마지막으로 의미 있는 가능성은 문자열이 일반 설정이며 이 경우 현재 개체에 추가된다는 것입니다.

어떤 옵션도 작동하지 않으면 함수에서 오류가 발생합니다.

^ 및 $를 자주 사용하면 표현식이 문자열의 일부가 아닌 전체 문자열과 일치하는지 확인할 수 있습니다. 이를 사용하지 않으면 코드는 일반적으로 작동하지만 때로는 이상한 결과가 발생하고 오류를 추적하기 어려울 수 있습니다.

if (match = string.match(...)) 구성은 while 루프에서 할당을 조건으로 사용하는 트릭과 유사합니다. match 호출이 성공할지 모르는 경우가 많으므로 이를 확인하는 if 블록 내부의 결과 개체에만 액세스할 수 있습니다. if 검사의 아름다운 체인을 깨지 않기 위해 검색 결과를 변수에 할당하고 이 할당을 즉시 검사로 사용합니다.

국제 문자 처음에는 언어가 단순하게 구현되었고 이후에 이러한 구현이 "화강암"으로 고정되었기 때문에 JavaScript 정규식은 영어에 없는 문자를 포함하는 어리석은 작업입니다. 예를 들어, JavaScript 정규 표현식의 관점에서 "문자" 문자는 영어 알파벳 26개 문자 중 하나일 수 있으며 어떤 이유로 밑줄도 될 수 있습니다. 분명히 문자인 é 또는 β와 같은 문자는 \w와 일치하지 않습니다(그리고 문자가 아닌 \W와 일치합니다).

이상하게도 \s(공백)는 역사적으로 줄바꿈하지 않는 공백이나 몽골어 모음 구분 기호 등을 포함하여 유니코드에서 공백으로 간주되는 모든 문자와 일치합니다.

다른 언어의 일부 정규식 구현에는 "모두 대문자", "모두 구두점" 또는 "제어 문자"와 같은 특수 범주의 유니코드 문자를 검색하기 위한 특수 구문이 있습니다. 이러한 카테고리를 JavaScript에 추가할 계획이 있지만 아마도 곧 구현되지는 않을 것입니다.

결론

정규식은 검색 패턴을 문자열로 나타내는 개체입니다. 이러한 패턴을 표현하기 위해 고유한 구문을 사용합니다.

/abc/ 문자 순서
// 목록의 모든 문자
/[^abc]/ 목록의 문자를 제외한 모든 문자
// 간격의 모든 문자
/x+/ 패턴 x가 하나 이상 발생합니다.
/x+?/ 하나 이상 발생, 비탐욕적
/x*/ 0회 이상 발생
/x?/ 0개 또는 1개 발생
/x(2,4)/ 2~4회 발생
/(abc)/ 그룹
/a|b|c/ 여러 패턴 중 하나
/\d/ 임의의 숫자
/\w/ 모든 영숫자 문자("문자")
/\s/ 공백 문자
/./ 줄바꿈을 제외한 모든 문자
/\b/ 단어 경계
/^/ 줄의 시작
/$/ 줄 끝

정규식에는 패턴이 문자열에 있는지 확인하는 테스트 방법이 있습니다. 발견된 모든 그룹을 포함하는 배열을 반환하는 exec 메서드가 있습니다. 배열에는 일치 항목이 발생한 문자의 번호가 포함된 index 속성이 있습니다.

문자열에는 패턴을 일치시키는 match 메소드와 발생의 시작 위치만 반환하는 검색 메소드가 있습니다. 바꾸기 메소드는 패턴의 발생을 다른 문자열로 바꿀 수 있습니다. 또한 템플릿과 발견된 그룹을 기반으로 대체 라인을 작성하는 대체 함수를 전달할 수 있습니다.

일반 문자에는 닫는 슬래시 뒤에 기록되는 설정이 있습니다. i 옵션은 정규식에서 대소문자를 구분하지 않게 하고, g 옵션은 정규식을 전역적으로 만듭니다. 이는 무엇보다도 교체 메소드가 첫 번째 항목뿐만 아니라 발견된 모든 항목을 바꾸도록 합니다.

RegExp 생성자를 사용하여 문자열에서 정규식을 만들 수 있습니다.

레귤레이터는 손잡이가 불편한 날카로운 도구입니다. 일부 작업을 크게 단순화하고 다른 복잡한 문제를 해결할 때 관리하기 어려워질 수 있습니다. 정규식을 사용하는 방법을 배우는 것 중 하나는 의도하지 않은 작업을 정규식으로 채우려는 유혹에 저항할 수 있다는 것입니다.

연습문제를 풀다 보면 필연적으로 이해할 수 없는 경우를 만나게 되고, 일부 정규 표현식의 예측할 수 없는 동작을 보고 절망할 수도 있습니다. 때로는 debuggex.com과 같은 온라인 서비스를 통해 일반 게임의 동작을 연구하는 것이 도움이 됩니다. 여기서 시각화를 확인하고 원하는 효과와 비교할 수 있습니다. 주어진 프로그램은 최소 문자 수로 표시됩니다. 레귤러 골프는 주어진 패턴을 찾기 위해 가능한 가장 작은 레귤러를 작성하는 실용적인 연습입니다.

각 하위 줄에 대해 정규식을 작성하여 줄에서의 위치를 ​​확인합니다. 일반 엔진은 지정된 하위 문자열만 찾아야 합니다. 특별히 언급하지 않는 한 단어 경계에 대해 걱정하지 마십시오. 작동하는 규칙적인 패턴이 있으면 이를 줄여보세요.

자동차와 고양이
- 팝과 소품
- 페럿, 페리, 페라리
- ious로 끝나는 모든 단어
- 공백 뒤에 마침표, 쉼표, 콜론 또는 세미콜론이 옵니다.
- 6글자보다 긴 단어
- 문자가 없는 단어 e

// 정규 표현식을 입력하세요 verify(/.../, ["my car", "bad cats"], ["camper", "high art"]); verify(/.../, ["대중문화", "미친 소품"], ["플롭"]); verify(/.../, ["ferret", "ferry", "ferrari"], ["ferrum", "transfer A"]); verify(/.../, ["맛있어요", "넓은 방"], ["파괴적", "의식"]); verify(/.../, ["잘못된 구두점 ."], ["점을 탈출하세요"]); verify(/.../, ["hottenottenten"], ["no", "hotten totten tenten"]); verify(/.../, ["빨간 오리너구리", "흔들리는 둥지"], ["흙 침대", "학습하는 원숭이"]); function verify(regexp, yes, no) ( // 완료되지 않은 연습 무시 if (regexp.source == "...") return; yes.forEach(function(s) ( if (!regexp.test(s)) console .log("찾을 수 없음 "" + s + """ )); no.forEach(function(s) ( if (regexp.test(s)) console.log("예기치 않은 발생 "" + s + " "" ); ));

텍스트의 인용문 이야기를 썼고 대화 내용을 나타내기 위해 전체에서 작은따옴표를 사용했다고 가정해 보겠습니다. 이제 대화 인용문을 큰따옴표로 바꾸고, are not과 같은 단어에 대한 약어로 작은따옴표를 남겨두고 싶습니다.

따옴표의 이 두 가지 용도를 구별하는 패턴을 생각해내고 교체를 수행하는 교체 메서드에 대한 호출을 작성하세요.

숫자 다시 간단한 정규식 /\d+/를 사용하여 일련의 숫자를 찾을 수 있습니다.

JavaScript 스타일로 작성된 숫자만 찾는 표현식을 작성하세요. 숫자, 소수점 및 과학적 표기법 5e-3 또는 1E10 앞에 가능한 마이너스 또는 플러스를 지원해야 하며, 다시 플러스 또는 마이너스도 가능합니다. 또한 점 앞이나 뒤에 숫자가 반드시 있을 필요는 없지만 숫자가 단일 점으로 구성될 수는 없습니다. 즉, .5 또는 5.는 유효한 숫자이지만 점 하나 자체는 유효하지 않습니다.

// 여기에 정규 시퀀스를 입력합니다. var 번호 = /^...$/; // 테스트: ["1", "-1", "+15", "1.55", ".5", "5.", "1.3e2", "1E-4", "1e+12"] .forEach(function(s) ( if (!number.test(s)) console.log(""" + s + """)를 찾지 못했습니다; )); ["1a", "+-1", "1.2.3", "1+1", "1e4.5", ".5.", "1f5", "."].forEach(함수 ( if (number.test(s)) console.log("잘못 승인됨 "" + s + """); ));

정규식의 구문은 매우 복잡하며 배우려면 많은 노력이 필요합니다. 오늘날 정규식에 대한 최고의 가이드는 J. Friedl의 저서 "Regular Expressions"입니다. 저자의 말에 따르면 이 책을 통해 "정규식으로 생각하는 방법을 배울 수 있습니다."

기본 개념

정규식은 텍스트 패턴을 정의하는 문자열이나 문자 시퀀스를 처리하는 수단입니다.

수정자 - 정규식을 "지시"하기 위한 것입니다.

메타 문자 - 특수 기호, 정규식 언어 명령으로 사용됩니다.

정규식은 일반 변수로 설정되며 따옴표 대신 슬래시만 사용됩니다. 예: var reg=/reg_expression/

가장 간단한 템플릿이란 특수 문자가 필요하지 않은 템플릿을 의미합니다.

우리의 임무가 모든 문자 "r"(소문자 및 대문자)을 구문의 라틴어 대문자 "R"로 바꾸는 것이라고 가정해 보겠습니다. 정규 표현식.

var reg=/р/ 메소드를 사용하여 템플릿을 생성합니다. 바꾸다우리는 우리의 계획을 실행한다



var reg=/р/

document.write(결과)

결과적으로 우리는 정규식 줄을 얻습니다. 대소문자를 고려하여 문자 "p"가 처음 나타나는 경우에만 교체가 발생했습니다.

하지만 이 결과는 우리 작업 조건에 맞지 않습니다... 여기서는 별도로 또는 함께 사용할 수 있는 수정자 "g"와 "i"가 필요합니다. 이러한 수정자는 정규식 패턴의 끝, 슬래시 뒤에 배치되며 다음과 같은 의미를 갖습니다.

수정자 "g" - 행의 검색을 "전역"으로 설정합니다. 즉, 우리의 경우 문자 "p"가 나타날 때마다 대체가 발생합니다. 이제 템플릿은 다음과 같습니다: var reg=/р/g , 코드에서 이를 대체합니다.


var str="정규식"
var reg=/р/g
var 결과=str.replace(reg, "R")
document.write(결과)

우리는 문자열(정규식)을 얻습니다.

수정자 "i" - 문자열에서 대소문자를 구분하지 않는 검색을 지정합니다. 이 수정자를 템플릿 var reg=/р/gi에 추가하면 스크립트를 실행한 후 원하는 작업 결과인 정규 표현식을 얻을 수 있습니다.

특수 문자(메타 문자)

메타문자는 검색된 문자열의 문자 유형, 검색된 문자열이 텍스트에서 둘러싸이는 방식, 표시된 텍스트의 특정 유형의 문자 수를 지정합니다. 따라서 메타문자는 세 그룹으로 나눌 수 있습니다.

  • 일치 항목을 검색하기 위한 메타문자입니다.
  • 정량적 메타문자.
  • 메타 문자 위치 지정.
일치를 위한 메타문자

의미

설명

단어 경계

단어의 시작이나 끝에서 패턴이 실행되어야 하는 조건을 지정합니다.

/\ber/ 일치 오류, 일치하지 않습니다 영웅또는 플레이어
/er/ 일치 플레이어, 일치하지 않습니다 영웅또는 오류
/\ber\b/가 일치하지 않습니다. 영웅또는 플레이어또는 오류, 다음과만 일치할 수 있습니다.

단어 제한이 아닌

단어의 시작이나 끝에서 패턴이 실행되지 않는 조건을 지정합니다.

/\Ber/ 일치 영웅또는 플레이어, 일치하지 않습니다 오류
/er\B/ 일치 오류또는 플레이어, 일치하지 않습니다 영웅
/\Ber\B/ 일치 영웅, 일치하지 않습니다 플레이어또는 오류

0부터 9까지의 숫자

/\d\d\d\d/는 임의의 4자리 숫자와 일치합니다.

/\D\D\D\D/는 일치하지 않습니다. 2005 또는 05.g또는 №126 등.

단일 빈 문자

공백 문자와 일치합니다.

\over\sbyte\만 일치합니다. 바이트 이상

공백이 아닌 단일 문자

공백을 제외한 모든 단일 문자

\over\Sbyte\ 일치 오버바이트또는 초과_바이트, 일치하지 않습니다 바이트 이상또는 오버바이트

문자, 숫자 또는 밑줄

/A\w/ 일치 A1또는 AB, 일치하지 않습니다 A+

문자, 숫자 또는 밑줄이 아님

/A\W/가 일치하지 않습니다. A1또는 AB, 일치 A+

모든 문자

모든 기호, 문자, 숫자 등

/.../는 세 문자와 일치합니다. 알파벳또는 !@4 또는 1개

문자 집합

대괄호로 묶인 문자 일치에 대해 패턴을 실행해야 하는 조건을 지정합니다.

/WERTY/ 일치 쿼티, 와 함께 어워티

포함되지 않은 문자 세트

대괄호로 묶인 문자 일치에 대해 패턴이 실행되지 않아야 하는 조건을 지정합니다.

/[^QA]WERTY/가 일치하지 않습니다. 쿼티, 와 함께 어워티

"검색 메타 문자 일치" 표에 나열된 문자를 \\t - 탭, \\n - 개행 등과 같이 문자열에 사용되는 이스케이프 문자 시퀀스와 혼동해서는 안 됩니다.

정량적 메타문자

우연의 수

0회 이상

/Ja*vaScript/ 일치 자바스크립트또는 자바스크립트또는 자바스크립트, 일치하지 않습니다 조바스크립트

0번 또는 1번

/Ja?vaScript/만 일치합니다. 자바스크립트또는 자바스크립트

한 번 이상

/Ja+vaScript/ 일치 자바스크립트또는 자바스크립트또는 자바스크립트, 일치하지 않습니다 자바스크립트

정확히 n번

/Ja(2)vaScript/만 일치합니다. 자바스크립트

n번 이상

/Ja(2,)vaScript/ 일치 자바스크립트또는 자바스크립트, 일치하지 않습니다 자바스크립트또는 자바스크립트

n회 이상, m회 이하

/Ja(2,3)vaScript/만 일치합니다. 자바스크립트또는 자바스크립트

양적 메타문자 표에 나열된 각 문자는 정규식에서 앞에 나오는 문자나 메타문자 하나에 적용됩니다.

메타문자 위치 지정

마지막 메타 문자 세트는 (중요한 경우) 줄의 시작 부분이나 끝 부분에서 하위 문자열을 찾을지 여부를 나타내기 위한 것입니다.

템플릿 작업을 위한 몇 가지 방법

바꾸기 - 기사의 시작 부분에서 이미 이 방법을 사용했습니다. 이 방법은 패턴을 검색하고 발견된 하위 문자열을 새 하위 문자열로 바꾸도록 설계되었습니다.

exec - 이 메소드는 템플릿에 지정된 패턴에 대해 문자열 일치를 수행합니다. 패턴 일치에 실패하면 null이 반환됩니다. 그렇지 않으면 결과는 주어진 패턴과 일치하는 하위 문자열 배열입니다. /*배열의 첫 번째 요소는 주어진 패턴을 만족하는 소스 문자열과 동일합니다*/

예를 들어:


var reg=/(\d+).(\d+).(\d+)/
var arr=reg.exec("저는 1980년 9월 15일에 태어났습니다.")
document.write("생년월일: ", arr, "< br>")
document.write("생일: ", arr, "< br>")
document.write("생년월: ", arr, "< br>")
document.write("생년월일: ", arr, "< br>")

결과적으로 우리는 네 줄을 얻습니다:
생년월일: 1980년 9월 15일
생일: 15
태어난 달: 09
출생연도: 1980년

결론

이 기사에서는 정규식의 모든 기능과 장점을 보여주지는 않습니다. 이 문제에 대해 더 깊이 연구하려면 RegExp 개체를 연구하는 것이 좋습니다. 또한 정규식의 구문은 JavaScript와 PHP 모두 다르지 않다는 사실에 주목하고 싶습니다. 예를 들어, 이메일이 올바르게 입력되었는지 확인하기 위해 JavaScript와 PHP의 정규식은 /+@+.(2,3)/i 와 동일하게 보입니다.



질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: