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 "패턴 일치" 를 참조하십시오.
정규식 연산자
,expr
NOT REGEXPpat
expr
NOT RLIKEpat
이것은
NOT (
와 동일합니다.expr
REGEXPpat
)
,expr
REGEXPpat
expr
RLIKEpat
패턴
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 진수로 표기됩니다.
이름 문자 이름 문자 NUL
0
SOH
001
STX
002
ETX
003
EOT
004
ENQ
005
ACK
006
BEL
007
alert
007
BS
010
backspace
'\b'
HT
011
tab
'\t'
LF
012
newline
'\n'
VT
013
vertical-tab
'\v'
FF
014
form-feed
'\f'
CR
015
carriage-return
'\r'
SO
016
SI
017
DLE
020
DC1
021
DC2
022
DC3
023
DC4
024
NAK
025
SYN
026
ETB
027
CAN
030
EM
031
SUB
032
ESC
033
IS4
034
FS
034
IS3
035
GS
035
IS2
036
RS
036
IS1
037
US
037
space
' '
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
'~'
DEL
177
mysql>
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
대문자 알파벳 문자 xdigit
16 진수 문자 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