수색…


식 정규 표현식의 숙어

변경 불가능한 지역 사용 :

"익명 임시 템플릿"템플릿보다 수평 공간은 적지 만 수직 공간은 더 사용합니다. "익명의 임시 템플릿"보다 선호하는 경우는 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 함수를 이해하는 데 필수적인 점은 정규식 patterninput 문자열을 일치시키는 결과를 기반으로한다는 것입니다. 일부 기능은 전체 일치가 필요하고 나머지는 부분 일치 만 필요합니다. 이 예제에 사용 된 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 문자열에 유효한 전화 번호가 없으면 변수 phoneNumbernull 입니다.

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow