Swift Regex (WWDC 2022) - ehrldyd15/Swift_Skills GitHub Wiki

Swift Regex (WWDC 2022)

Swift Regex API๋Š” IOS 16๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Regex๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๋“ค

1. String

init(String) throws๋ฅผ ์‚ฌ์šฉ

    let regex = try Regex(#"Hi, WWDC\d{2}!"#)

#"..."# ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด string์— escaping์„ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

2. //

// ๋‚ด์— ์ •๊ทœํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ Regex ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

    let regex = /Hi, WWDC\d{2}!/

/.../ ํŒจํ„ด์„ Regex Literal ์ด๋ผ ๋ถ€๋ฅธ๋‹ค.

3. RegexBuilder

    @available(macOS 13.0, iOS 16.0, watchOS 9.0, tvOS 16.0, *)
    extension Regex {
        public init<Content>(@RegexComponentBuilder _ content: () -> Content) where Output == Content.RegexOutput, Content : RegexComponent
    }

RegexBuilder ๋ชจ๋“ˆ ๋‚ด์—๋Š” ์œ„์™€ ๊ฐ™์€ extension์ด ์žˆ๋‹ค.

(์ฐธ๊ณ : https://developer.apple.com/documentation/RegexBuilder)

๋”ฐ๋ผ์„œ RegexBuilder๋ฅผ importํ•˜๋ฉด RegexBuilder๋ฅผ ์ด์šฉํ•˜์—ฌ DSL ๋ฐฉ์‹์œผ๋กœ ์ •๊ทœํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    import RegexBuilder

    let regex = Regex {
        "Hi, WWDC"
        Repeat(.digit, count: 2)
        "!"
    }

๋ฌธ๋ฒ•์„ ์ž˜ ๋ชฐ๋ผ๋„ ์ฝ”๋“œ๋กœ ๋ฐ”๋กœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ณต์žกํ•œ ํ‘œํ˜„์‹์„ ์œ„ํ•˜์—ฌ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๋„ ์—†์ด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-27 แ„‹แ…ฉแ„’แ…ฎ 3 32 22

body์— Regex literal์„ ๋ฐ”๋กœ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-27 แ„‹แ…ฉแ„’แ…ฎ 3 34 50

์œ„ ์ฒ˜๋Ÿผ ์นœ์ˆ™ํ•œ regex literal์„ ํฌํ•จํ•˜๋Š” ์‹์œผ๋กœ ์จ๋„ ๋œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-27 แ„‹แ…ฉแ„’แ…ฎ 3 36 46

matching ๋˜๋Š” strings ์ฐพ๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-09-27 แ„‹แ…ฉแ„’แ…ฎ 3 40 53

๊ทธ์กฐ๊ฐ€ ์œ„ ์ฒ˜๋Ÿผ ๋˜์–ด ์žˆ์–ด์„œ

Regex์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ  Foundation์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, ์ฒซ๋ฒˆ์งธ๋กœ ๋งค์นญ๋˜๋Š” ๊ฒƒ์„ ์ฐพ๊ณ  ์‹ถ์„ ๋•Œ

Regex์˜ ๋ฉ”์†Œ๋“œ์ธ firstMatch(in:)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜

BidirectionalCollection (Int, String, Array ๋“ฑ์ด ์ปจํŽŒํ•˜๋Š” ํ”„๋กœํ† ์ฝœ)์— ์žˆ๋Š” firstMatch(of:)๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.

    import RegexBuilder

    let regex = Regex {
        "Hi, WWDC"
        Repeat(.digit, count: 2)
        "!"
    }

    let input = "Hi, WWDC21! Hi, WWDC22! Hi Hello"

    let match1 = try regex.firstMatch(in: input)?.output // Hi, WWDC21!
    let match2 = input.firstMatch(of: regex)?.output // Hi, WWDC21!

์ฐธ๊ณ ๋กœ Regex์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋“ค์€ string๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ ,

WWDC์—์„œ๋Š” Foundation ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๋ช…ํ•œ๋‹ค.

1. FirstMatch / WholeMatch / Matches

firstMatch: ์ฒซ๋ฒˆ์งธ๋กœ regex์™€ ๋งค์นญ๋˜๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ด

wholeMatch: ์ „์ฒด ๋ฌธ์žฅ์ด ๋ชจ๋‘ regex์™€ ๋งค์นญ๋˜๋Š” ๋ฌธ์ž์—ด ๋ฆฌํ„ด

matches: ๋งค์นญ๋˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด collection ๋ฆฌํ„ด

    import RegexBuilder

    let regex = Regex {
        "Hi, WWDC"
        Repeat(.digit, count: 2)
        "!"
    }

    let input = "Hi, WWDC21! Hi, WWDC22! Hi Hello"

    let firstMatch: Regex.Match? = input.firstMatch(of: regex)
    print("First Matched: \(firstMatch?.output)")
    // First Matched: Optional("Hi, WWDC21!")
    
    let wholeMatch: Regex.Match? = input.wholeMatch(of: regex)
    print("Whole Matched: \(wholeMatch?.output)")
    // Whole Matched: nil
    
    let matches: [Regex.Match] = input.matches(of: regex)
    print("Matched: \(matches.map { $0.output })")
    // Matched: ["Hi, WWDC21!", "Hi, WWDC22!"]

๋ฆฌํ„ด ํƒ€์ž…์ธ Regex.Match์€ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด๊ณ  ์žˆ์œผ๋ฉฐ output๊ณผ range๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

2. Capture

RegexBuilder์˜ Capture๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์บก์ณํ•  ์ˆ˜ ์žˆ๋‹ค.

    import RegexBuilder

    let regex = Regex {
        "Hi, WWDC"
        Capture {
            Repeat(.digit, count: 2)
        }
        "!"
    }

    let input = "Hi, WWDC21! Hi, WWDC22! Hi Hello"

    if let firstMatch = input.firstMatch(of: regex) {
        let (firstMatched, digits) = firstMatch.output
        print(firstMatched) // Hi, WWDC21!
        print(digits) // 21
    }

์ฐธ๊ณ  ์ž๋ฃŒ

https://brunch.co.kr/@eunjin3786/281

โš ๏ธ **GitHub.com Fallback** โš ๏ธ