12.5.2 정규 표현식
표 12.9 문자열 정규식 연산자
| 이름 | 설명 |
|---|---|
NOT REGEXP | REGEXP의 부정 |
REGEXP | 정규식을 사용하여 패턴 일치 |
RLIKE | REGEXP의 동의어입니다 |
정규 표현식은 복잡한 검색 패턴을 지정하는 강력한 방법입니다.
MySQL에서는 POSIX 1003.2 준수하는 것을 목적으로 한 Henry Spencer 씨의 정규식 구현이 사용됩니다. MySQL은 SQL 문에서 REGEXP 연산자와 함께 실행되는 패턴 매칭 연산을 지원하기 위해 확장 버전을 사용하고 있습니다.
이 섹션에서는 MySQL의 REGEXP 연산에 사용할 수있는 특수 문자 나 구조를 예를 보여 요약하고 있습니다. Henry Spencer 씨의 regex(7) 매뉴얼 페이지에서 찾을 수 정보가 모두 포함되어있는 것은 아닙니다. 그 매뉴얼 페이지는 MySQL 소스 배포판의 regex 디렉토리에있는 regex.7 파일에 포함되어 있습니다. 섹션 3.3.4.7 "패턴 일치" 를 참조하십시오.
정규식 연산자
,exprNOT REGEXPpatexprNOT RLIKEpat이것은
NOT (와 동일합니다.exprREGEXPpat),exprREGEXPpatexprRLIKEpat패턴
pat과 비교하여 문자열 식expr의 패턴 일치를 수행합니다. 패턴은 확장 정규 표현식이 될 수 있습니다. 구문은이 섹션의 뒷부분에서 설명합니다.expr이pat과 일치하는 경우는1을 반환하고, 그렇지 않으면0을 반환합니다.expr또는pat중 하나가NULL이면 결과도NULL입니다.RLIKE는mSQL과의 호환성을 보장하기 위해 마련된REGEXP의 동의어입니다.패턴은 리터럴 문자열 일 필요는 없습니다. 예를 들어, 문자열 식이나 테이블 컬럼으로 지정할 수 있습니다.
참고MySQL에서 문자열 C의 이스케이프 구문 (예를 들어, 개행 문자를 나타 내기 위해 "
\n")를 사용하고 있기 때문에,REGEXP문자열에서 사용되는 "\"모두 이중으로 지정해야합니다 .REGEXP는 이진 문자열로 사용되는 경우를 제외하고는 대소 문자를 구분하지 않습니다.mysql>
SELECT 'Monty!' REGEXP '.*';-> 1 mysql>SELECT 'new*\n*line' REGEXP 'new\\*.\\*line';-> 1 mysql>SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';-> 1 0 mysql>SELECT 'a' REGEXP '^[ad]';-> 1REGEXP및RLIKE에서는 문자의 형태를 결정할 때와 비교를 수행 할 때 인수의 문자 집합 및 정렬 순서가 사용됩니다. 인수에 다양한 문자 집합 또는 데이터 정렬이 포함 된 경우 섹션 10.1.7.5 "식의 데이터 정렬" 에 설명 된대로 형식 변환 속성 규칙이 적용됩니다.경고REGEXP및RLIKE연산자는 바이트 단위로 작동하므로 멀티 바이트 안전이 아닌 멀티 바이트 문자 집합을 사용하면 예기치 않은 결과가 생성 될 수 있습니다. 또한 이러한 연산자는 그 바이트 값을 기준으로 문자가 비교되기 때문에 악센트 문자는 지정된 데이터 정렬이 동일하다고 간주되는 경우에도 동일한으로 비교되지 않을 수 있습니다.
정규식 구문
정규 표현식은 문자열의 집합을 설명합니다. 가장 간단한 정규식 특수 문자를 사용하지 않는 것입니다. 예를 들어, 정규 표현식 hello 은 hello 에만 일치합니다.
중요한 정규식에서는 여러 문자열과 일치 할 수 있도록 특정 특수 구조가 사용됩니다. 예를 들어, 정규 표현식 hello|word 은 캐릭터 라인 hello 또는 캐릭터 라인 word 에 일치합니다.
보다 복잡한 예제로 정규식 B[an]*s 는 문자열 Bananas , Baaaaas , Bs 중 하나와 B 로 시작하고 s 로 끝나고 그 사이에 숫자의 a 또는 n 문자가 포함 된 기타 문자열과 일치합니다.
REGEXP 연산자의 정규식은 다음의 특수 문자 및 구조 중 하나가 사용되는 경우가 있습니다.
^문자열의 시작과 일치합니다.
mysql>
SELECT 'fo\nfo' REGEXP '^fo$';-> 0 mysql>SELECT 'fofo' REGEXP '^fo';-> 1$문자열의 끝과 일치합니다.
mysql>
SELECT 'fo\no' REGEXP '^fo\no$';-> 1 mysql>SELECT 'fo\no' REGEXP '^fo$';-> 0.문자 (캐리지 리턴 및 줄 바꿈을 포함)과 일치합니다.
mysql>
SELECT 'fofo' REGEXP '^f.*$';-> 1 mysql>SELECT 'fo\r\nfo' REGEXP '^f.*$';-> 1a*0 개 이상의
a문자의 순서와 일치합니다.mysql>
SELECT 'Ban' REGEXP '^Ba*n';-> 1 mysql>SELECT 'Baaan' REGEXP '^Ba*n';-> 1 mysql>SELECT 'Bn' REGEXP '^Ba*n';-> 1a+1 개 이상의
a문자의 순서와 일치합니다.mysql>
SELECT 'Ban' REGEXP '^Ba+n';-> 1 mysql>SELECT 'Bn' REGEXP '^Ba+n';-> 0a?제로 또는 1 개의
a문자와 일치합니다.mysql>
SELECT 'Bn' REGEXP '^Ba?n';-> 1 mysql>SELECT 'Ban' REGEXP '^Ba?n';-> 1 mysql>SELECT 'Baan' REGEXP '^Ba?n';-> 0de|abc시퀀스
de또는abc중 하나와 일치합니다.mysql>
SELECT 'pi' REGEXP 'pi|apa';-> 1 mysql>SELECT 'axe' REGEXP 'pi|apa';-> 0 mysql>SELECT 'apa' REGEXP 'pi|apa';-> 1 mysql>SELECT 'apa' REGEXP '^(pi|apa)$';-> 1 mysql>SELECT 'pi' REGEXP '^(pi|apa)$';-> 1 mysql>SELECT 'pix' REGEXP '^(pi|apa)$';-> 0(abc)*시퀀스
abc의 0 개 이상의 인스턴스와 일치합니다.mysql>
SELECT 'pi' REGEXP '^(pi)*$';-> 1 mysql>SELECT 'pip' REGEXP '^(pi)*$';-> 0 mysql>SELECT 'pipi' REGEXP '^(pi)*$';-> 1{1},{2,3}{n}또는{m,n}주석에서는 패턴의 이전 원자 (또는 "부분")의 다수의 출현과 일치하는 정규 표현식을 설명하는보다 일반적인 방법이 제공됩니다.m및n은 정수입니다.a*a{0,}과 작성할 수 있습니다.a+a{1,}과 작성할 수 있습니다.a?a{0,1}과 작성할 수 있습니다.
더 엄밀히 말하면,
a{n}는a의 정확히n개의 인스턴스와 일치합니다.a{n,}는a의n개 이상의 인스턴스와 일치합니다.a{m,n}는a의m개에서n개까지의 인스턴스와 일치합니다.m및n은0에서RE_DUP_MAX(디폴트는 255)까지의 범위 내에 있어야합니다.m및n모두가 지정되어있는 경우m을n다음에해야합니다.mysql>
SELECT 'abcde' REGEXP 'a[bcd]{2}e';-> 0 mysql>SELECT 'abcde' REGEXP 'a[bcd]{3}e';-> 1 mysql>SELECT 'abcde' REGEXP 'a[bcd]{1,10}e';-> 1[a-dX],[^a-dX]a,b,c,d, 또는X이다 (^이 사용되는 경우는 그렇지) 임의의 문자와 일치합니다. 두 문자 사이의-문자는 첫 번째 문자에서 두 번째 문자까지의 모든 문자와 일치하는 범위가 형성됩니다. 예를 들어,[0-9]는 임의의 10 진수와 일치합니다. 리터럴 문자]를 포함 왼쪽 괄호[직후에 기술해야합니다. 리터럴 문자-를 포함하려면 첫 번째 또는 마지막에 기술 할 필요가 있습니다.[]쌍의 내부에 정의 된 특수한 의미를 가지지 않는 문자는 그 자체로 밖에 일치하지 않습니다.mysql>
SELECT 'aXbc' REGEXP '[a-dXYZ]';-> 1 mysql>SELECT 'aXbc' REGEXP '^[a-dXYZ]$';-> 0 mysql>SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';-> 1 mysql>SELECT 'aXbc' REGEXP '^[^a-dXYZ]+$';-> 0 mysql>SELECT 'gheis' REGEXP '^[^a-dXYZ]+$';-> 1 mysql>SELECT 'gheisa' REGEXP '^[^a-dXYZ]+$';-> 0[.characters.](
[와]를 사용하여 작성된) 괄호 식에 그 조합 요소의 문자에 해당합니다.characters는 단일 문자 또는newline등의 문자 이름입니다. 다음 표는 허용되는 문자 이름을 나열합니다.다음 표는 허용되는 문자 이름과 일치하는 문자를 표시합니다. 숫자로 지정된 문자는 값이 8 진수로 표기됩니다.
이름 문자 이름 문자 NUL0SOH001STX002ETX003EOT004ENQ005ACK006BEL007alert007BS010backspace'\b'HT011tab'\t'LF012newline'\n'VT013vertical-tab'\v'FF014form-feed'\f'CR015carriage-return'\r'SO016SI017DLE020DC1021DC2022DC3023DC4024NAK025SYN026ETB027CAN030EM031SUB032ESC033IS4034FS034IS3035GS035IS2036RS036IS1037US037space' 'exclamation-mark'!'quotation-mark'"'number-sign'#'dollar-sign'$'percent-sign'%'ampersand'&'apostrophe'\''left-parenthesis'('right-parenthesis')'asterisk'*'plus-sign'+'comma','hyphen'-'hyphen-minus'-'period'.'full-stop'.'slash'/'solidus'/'zero'0'one'1'two'2'three'3'four'4'five'5'six'6'seven'7'eight'8'nine'9'colon':'semicolon';'less-than-sign'<'equals-sign'='greater-than-sign'>'question-mark'?'commercial-at'@'left-square-bracket'['backslash'\\'reverse-solidus'\\'right-square-bracket']'circumflex'^'circumflex-accent'^'underscore'_'low-line'_'grave-accent'`'left-brace'{'left-curly-bracket'{'vertical-line'|'right-brace'}'right-curly-bracket'}'tilde'~'DEL177mysql>
SELECT '~' REGEXP '[[.~.]]';-> 1 mysql>SELECT '~' REGEXP '[[.tilde.]]';-> 1[=character_class=](
[및]사용하여 작성된) 괄호 식의[=character_class=]는 등가 클래스를 나타냅니다. 이것은 동일한 데이터 정렬 값을 가진 모든 문자 (자신을 포함)과 일치합니다. 예를 들어,o및(+)가 등가 클래스의 멤버 인 경우,[[=o=]],[[=(+)=]]및[o(+)]는 모든 동의어입니다. 등가 클래스는 범위의 끝점으로 사용할 수없는 경우도 있습니다.[:character_class:](
[와]를 사용하여 작성된) 괄호 식의[:character_class:]는 그 클래스에 속하는 모든 문자와 일치하는 문자 클래스를 나타냅니다. 다음 표는 표준 클래스 이름을 나열합니다. 이 이름은ctype(3)매뉴얼 페이지에 정의 된 문자 클래스를 나타냅니다. 특정 로케일에서는 다른 클래스 이름이 제공되는 경우도 있습니다. 문자 클래스는 범위의 끝점으로 사용할 수없는 경우도 있습니다.문자 클래스 이름 의미 alnum영숫자 alpha알파벳 문자 blank공백 cntrl제어 문자 digit숫자 문자 graph도형 문자 lower소문자 알파벳 문자 print도형 또는 공백 punct구두점 문자 space공백, 탭, 줄 바꿈 및 캐리지 리턴 upper대문자 알파벳 문자 xdigit16 진수 문자 mysql>
SELECT 'justalnums' REGEXP '[[:alnum:]]+';-> 1 mysql>SELECT '!!' REGEXP '[[:alnum:]]+';-> 0[[:<:]],[[:>:]]이러한 마커는 단어 경계를 나타냅니다. 단어의 시작과 끝에 각각 일치합니다. 단어는 전후에 단어 문자가 존재하지 않는 단어 문자의 시퀀스입니다. 단어 문자는
alnum클래스의 영숫자 문자 또는 밑줄 (_)입니다.mysql>
SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';-> 1 mysql>SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';-> 0
정규 표현식에서 특수 문자의 리터럴 인스턴스를 사용하려면 이전에 2 개의 백 슬래시 (\) 문자를 넣습니다. MySQL 파서가 2 개의 backslash 중 하나를 해석하고 정규 표현식 라이브러리가 다른 쪽을 해석합니다. 예를 들어, 특수 문자 + 가 포함 된 문자열 1+2 에 일치하는 정규 표현식은 다음 중 마지막 것뿐입니다.
mysql>SELECT '1+2' REGEXP '1+2';-> 0 mysql>SELECT '1+2' REGEXP '1\+2';-> 0 mysql>SELECT '1+2' REGEXP '1\\+2';-> 1