수색…
식 정규 표현식의 숙어
변경 불가능한 지역 사용 :
"익명 임시 템플릿"템플릿보다 수평 공간은 적지 만 수직 공간은 더 사용합니다. "익명의 임시 템플릿"보다 선호하는 경우는 when
식이 루프에있는 경우입니다.이 경우 regex 정의는 루프 외부에 배치해야합니다.
import kotlin.text.regex
var string = /* some string */
val regex1 = Regex( /* pattern */ )
val regex2 = Regex( /* pattern */ )
/* etc */
when {
regex1.matches(string) -> /* do stuff */
regex2.matches(string) -> /* do stuff */
/* etc */
}
익명 임시 사용자 사용 :
"불변 인 지역"템플릿보다 수직 공간은 적지 만 수평 공간은 더 많이 사용합니다. 표현식이 루프에 when
사용하면 안됩니다.
import kotlin.text.regex
var string = /* some string */
when {
Regex( /* pattern */ ).matches(string) -> /* do stuff */
Regex( /* pattern */ ).matches(string) -> /* do stuff */
/* etc */
}
방문자 패턴 사용 :
syntax가 when
"인수 - 풀"을 면밀히 모방하는 이점이 있습니다. 이는 when
식의 인수를보다 명확하게 나타내므로 모든 whenEntry
에서 when
인수를 반복하지 않아도 발생할 수있는 특정 프로그래머 실수를 방지하기 때문에 whenEntry
합니다. "immutable locals"또는 "anonymous temporaries"템플릿 중 하나가이 구현과 함께 방문자 패턴으로 사용될 수 있습니다.
import kotlin.text.regex
var string = /* some string */
when (RegexWhenArgument(string)) {
Regex( /* pattern */ ) -> /* do stuff */
Regex( /* pattern */ ) -> /* do stuff */
/* etc */
}
그리고 when
표현식 인수에 대한 래퍼 클래스의 최소 정의 :
class RegexWhenArgument (val whenArgument: CharSequence) {
operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}
Kotlin의 정규 표현식 소개
이 게시물은 Regex
클래스의 대부분의 함수를 사용하는 방법, Regex
함수와 안전하게 관련있는 null 작업 방법, 그리고 원시 문자열을 사용하여 정규식 패턴을 작성하고 읽는 것이 더 쉬워지는 방법을 보여줍니다.
RegEx 클래스
Kotlin에서 정규 표현식을 사용하려면 Regex(pattern: String)
클래스를 사용하고 해당 정규 표현식 객체에서 find(..)
또는 replace(..)
와 같은 함수를 호출해야합니다.
input
문자열에 c 또는 d가 있으면 true를 반환하는 Regex
클래스를 사용하는 방법에 대한 예제입니다.
val regex = Regex(pattern = "c|d")
val matched = regex.containsMatchIn(input = "abc") // matched: true
모든 Regex
함수를 이해하는 데 필수적인 점은 정규식 pattern
과 input
문자열을 일치시키는 결과를 기반으로한다는 것입니다. 일부 기능은 전체 일치가 필요하고 나머지는 부분 일치 만 필요합니다. 이 예제에 사용 된 containsMatchIn(..)
함수는 부분 일치가 필요하며이 게시물의 뒷부분에서 설명합니다.
정규식을 사용한 Null 안전성
find(..)
와 matchEntire(..)
는 MatchResult?
를 반환 할 MatchResult?
목적. ?
MatchResult
이후의 문자는 Kotlin이 null을 안전하게 처리하는 데 필요합니다.
find(..)
함수가 null을 반환 할 때 Kotlin이 Regex
함수에서 안전하게 null을 처리하는 방법을 보여주는 예제입니다.
val matchResult =
Regex("c|d").find("efg") // matchResult: null
val a = matchResult?.value // a: null
val b = matchResult?.value.orEmpty() // b: ""
a?.toUpperCase() // Still needs question mark. => null
b.toUpperCase() // Accesses the function directly. => ""
orEmpty()
함수를 사용하면 b
는 null 일 수 없으며 ?
b
함수를 호출 할 때 문자가 필요하지 않습니다.
null 값의이 안전한 처리에 대해 신경 쓰지 않는다면 Kotlin은 Java에서와 같이 null 값을 사용하여 작업 할 수 있습니다 !!
문자 :
a!!.toUpperCase() // => KotlinNullPointerException
정규식 패턴의 원시 문자열
Kotlin은 원시 문자열 을 사용하여 Java에 비해 향상된 기능을 제공하므로 Java 문자열에 필요한 이중 백 슬래시없이 순수 정규 표현식 패턴을 작성할 수 있습니다. 원시 문자열은 트리플 쿼트로 표시됩니다.
"""\d{3}-\d{3}-\d{4}""" // raw Kotlin string
"\\d{3}-\\d{3}-\\d{4}" // standard Java string
찾기 (입력 : CharSequence, startIndex : int) : MatchResult?
input
문자열은 Regex
객체의 pattern
과 일치합니다. Matchresult?
반환 Matchresult?
startIndex
다음에 첫 번째로 일치하는 텍스트가있는 객체이거나 패턴이 input
문자열과 일치하지 않으면 null
입니다. 결과 문자열은 MatchResult?
에서 검색 MatchResult?
객체의 value
속성. startIndex
매개 변수는 선택적이며 기본값은 0입니다.
연락처 세부 정보가있는 문자열에서 첫 번째 유효한 전화 번호를 추출하려면 다음과 같이하십시오.
val phoneNumber :String? = Regex(pattern = """\d{3}-\d{3}-\d{4}""")
.find(input = "phone: 123-456-7890, e..")?.value // phoneNumber: 123-456-7890
input
문자열에 유효한 전화 번호가 없으면 변수 phoneNumber
는 null
입니다.
findAll (input : CharSequence, startIndex : Int) : 시퀀스입니다.
regex pattern
과 일치하는 input
문자열에서 모든 일치를 반환합니다.
공백으로 구분 된 모든 숫자를 문자와 숫자가있는 텍스트에서 인쇄하려면 :
val matchedResults = Regex(pattern = """\d+""").findAll(input = "ab12cd34ef")
val result = StringBuilder()
for (matchedText in matchedResults) {
result.append(matchedText.value + " ")
}
println(result) // => 12 34
matchedResults
변수는 MatchResult
객체가있는 시퀀스입니다. 숫자가없는 input
문자열을 사용하면 findAll(..)
함수는 빈 시퀀스를 반환합니다.
matchEntire (입력 : CharSequence) : MatchResult?
input
문자열의 모든 문자가 정규식 pattern
과 일치하면 input
과 동일한 문자열이 반환됩니다. 그렇지 않은 경우는 null
이 돌려 주어집니다.
전체 입력 문자열이 숫자 인 경우 입력 문자열을 반환합니다.
val a = Regex("""\d+""").matchEntire("100")?.value // a: 100
val b = Regex("""\d+""").matchEntire("100 dollars")?.value // b: null
matches (input : CharSequence) : Boolean
전체 입력 문자열이 정규식 패턴과 일치하면 true를 반환합니다. 그렇지 않으면 거짓.
두 문자열에 숫자 만 들어 있는지 테스트합니다.
val regex = Regex(pattern = """\d+""")
regex.matches(input = "50") // => true
regex.matches(input = "50 dollars") // => false
containsMatchIn (input : CharSequence) : Boolean
입력 문자열의 일부가 정규식 패턴과 일치하는 경우 true를 반환합니다. 그렇지 않으면 거짓.
두 문자열에 적어도 하나의 숫자가 포함되어 있는지 테스트하십시오.
Regex("""\d+""").containsMatchIn("50 dollars") // => true
Regex("""\d+""").containsMatchIn("Fifty dollars") // => false
split (입력 : CharSequence, limit : Int) : 목록
모든 정규식 일치 항목이없는 새 목록을 반환합니다.
숫자없이 목록을 반환하려면 :
val a = Regex("""\d+""").split("ab12cd34ef") // a: [ab, cd, ef]
val b = Regex("""\d+""").split("This is a test") // b: [This is a test]
각 분할마다 목록에 하나의 요소가 있습니다. 첫 번째 input
문자열에는 세 개의 숫자가 있습니다. 그 결과 세 가지 요소가 포함 된 목록이 생성됩니다.
대체 (입력 : CharSequence, 대체 : 문자열) : 문자열
input
문자열에있는 정규식 pattern
의 모든 일치 항목을 대체 문자열로 바꿉니다.
문자열의 모든 자릿수를 x :
val result = Regex("""\d+""").replace("ab12cd34ef", "x") // result: abxcdxef