Skip to content

Latest commit

 

History

History
306 lines (212 loc) · 5.29 KB

정규식.md

File metadata and controls

306 lines (212 loc) · 5.29 KB

코틀린 정규식 사용하기

기본

^x : 문자열의 시작을 의미한다. x로 시작하는 문자열을 찾는다.

Regex("^x")
x -> false
yx -> flase
xyx -> false
123 -> false

x$ : 문자열의 종료을 의미한다. x로 끝나는 문자열을 찾는다.

Regex("x$")
x -> true
yx -> false
xyz -> false
123 -> false

.x : 임의의 한 문자(특수 문자 포함)의 자리수를 표현하며 표현에는 문자열이 x 로 끝난다는 것을 의미한다.

Regex(".x")
x -> false
yx -> true
xyz -> false
123 -> false
Regex(".")
x -> true
. -> true-> true
1 -> true
? -> true
xy -> false

x+ : 문자의 반복을 의미한다. x문자가 반드시 한 번 이상 반복된다.

Regex("x+")
x -> true
yx -> false
xxxxxxx -> true
xxxxxyx -> false

x? : 문자 존재여부를 의미한다. x문자가 존재할수도 안할수도 있다.

Regex("x?")
x -> true 
y -> false
xyz -> false
z -> false

x* : 문자의 반복여부를 의미한다. x문자가 0번 또는 그 이상 반복된다.

Regex("x*")
x -> true
y -> false
yx -> false
xxxxxx -> true
xxxxxyx -> false

.* : 클레이니 스타 (kleene star)라고 하며 임의 연속된 문자를 표현할 때 사용됨

x|y : or를 의미한다. x 혹은 y 문자가 존해함을 의미한다.

Regex("x|y")
x -> true
y -> true
xy -> false
xyz -> false

(x) : 그룹을 의미하며, x문자를 그룹으로 처리함을 의미한다. (x)(y) : 그룹들을 집합으로 관리하며 앞순서대로 번호를 부여하며 관리한다. (z(x)(y)) : (x), (y), (zyx) 순서로 번호가 부여된다. ((x)(y(z))) : (x), (z), (y(z)) , ((x)(y(z))) 순서대로 번호가 부여된다.

")" 순서대로 그룹 순서가 결정된다고 생각하면 쉽다.

(x)(?:y) : 그룹 집합으로 관리되지 않음을 의미한다.

x{n} : 반복의 표현이며, x문자가 n번 반복됨을 의미한다.

Regex("x{3}")
x -> false
xx -> false
xxx -> true
xxxx -> false

x{n,} : 반복의 표현이며, x문자가 n번 이상 반복됨을 의미한다. ("," 다음에 공백은 존재하지 않는다.)

Regex("x{3,}")
x -> false
xx -> false
xxx -> true
xxxx -> true
xxxxxxxxx -> true

x{n,m} : 반복의 표현이며, x문자가 n번 이상 m번 이하 반복됨을 의미한다.

Regex("x{3,6}")
x -> false
xx -> false
xxx -> true
xxxx -> true
xxxxx -> true
xxxxxx -> true
xxxxxxx -> false

[xy] : 문자를 선택을 의미하며, x 혹은 y 중 하나를 찾는다.

Regex("[xy]")
x -> true
xy -> false
xyz -> false

[^xy] : not을 의미하며, x 혹은 y가 없 문자를 찾는다.

Regex("[^xy]")
x -> false
xy -> false
yx -> false
xyz -> false
z -> true

[a-z] : 범위를 의미하며, a부터 z까지의 일치하는 문자 하나를 찾는다.

Regex("[a-z]")
x -> true
xy -> false
yx -> false
xyz -> false
z -> true

만약 소문자 단어를 것을 찾기 위해서는 + 를 이용하여 [a-z]+로 사용하도록 한다.

\^, \%, \@ : 특수문자를 정규식에 문자로 찾는다

Regex("\\^")
@ -> false
# -> false
^ -> true

\\d : 숫자를 찾는다. (digit)

Regex("\\d")
1 -> true
12 -> false
@ -> false
a -> false

\\D : 숫자가 아닌 문자를 찾는다

Regex("\\D")
1 -> false
12 -> false
@ -> true
a -> true

\\s : 공백인 문자를 찾는다.

Regex("\\s")
 -> true
1 -> false
a -> false
@ -> false

\\S : 공백이 아닌 문자를 찾는다.

Regex("\\S")
 -> false
1 -> true
a -> true

\\w : 알파뱃, 숫자, _ 를 찾는다.

Regex("\\w")
 -> false
1 -> true
a -> true-> false
@ -> false
_ -> true

\\W : 알파뱃, 숫자, _ 가 아닌 문자를 찾는다.

Regex("\\w")
 -> true
1 -> false
a -> false-> true
@ -> true
_ -> false

그룹

서버에러가 내려오는데 객체가 아닌 문자로만 어떤 위치과 구간를 나타내는 에러 메시지를 보내고 싶다고 가정해보자. ex) serverError[io].middle -> io라는 위치에 middle 구간에 문제가 발생

val regex = Regex("^serverError\\[([a-zA-Z]{2})]\\.(top|middle|middle)$")
val localValue = "serverError[xy].top"
val result = regex.matchEntire(localValue)

이 때 groupValues를 보면 인덱스 1부터 앞에서 부터 찾은 ()그룹을 보여주고 있다. 이를 result.groupValues[1], result.groupValues[2] 로 클라이언트단에서는 위치, 구간을 따로 받아 핸들링할 수 있다.

val serverRegex = Regex("^serverError\\[([a-zA-Z]{2})]\\.(top|middle|bottom)$")
val localValue = "serverError[xy].top"
val result = serverRegex.matchEntire(localValue)

if (result != null) {
    val groupValues = result.groupValues
    val section = groupValues[1]
    val position = groupValues[2]
        
    println("서버문제 발생 : $section 섹션 ${position}에 문제 발생")
}

// 서버문제 발생 : xy 섹션 top에 문제 발생

// result.value -> serverError[xy].top
// result.groups -> [MatchGroup(value=serverError[xy].top, range=0..18), MatchGroup(value=xy, range=12..13), MatchGroup(value=top, range=16..18)]
// result.groupValues -> [serverError[xy].top, xy, top]
// result.range -> 0..18