Swift 3.0에서 기본 정규식을 수행하는 extension

편집 내역



2016년 12월 5일에 다음 수정
  • 탐색하는 캐릭터 라인에 이모티콘이 포함되어 있었을 경우, 능숙하게 「치환」되지 않았던 것을 깨닫고 수정했습니다.
  • 「탐색 결과」에 대해 서브 패턴에 대응할 수 없었던 것을 깨닫고 수정했습니다.

  • 2017년 11월 12일에 다음 수정
  • Swift4.0에 의한 String 클래스에 의한 「count」프로퍼티의 변경



  • 소개



    안녕하세요.
    메소드가 점점 바뀌어 가거나,
    Swift의 정규 표현은 서투르고 곤란해 버렸으므로,
    문자열의 기본적인 조작인 「검색」과 「치환」을 실시하는 StringExtension를 써 보았습니다.
    탐색 결과를 이용하는 부분을 PHP의 preg_match와 비슷하게 쓰고 싶었습니다만,
    조금 다를 수 있습니다 ... 미안 해요.
    이르지 못하는 점 등 많이 있다고 생각합니다만, 코멘트등 받을 수 있으면 다행입니다.

    샘플



    탐험



    sample.swift
    var text = "Swwwwift"
    
    if text.pregMatche(pattern: "Sw*ift") {
        print("マッチしました")
    } else {
        print("マッチしていません")
    }
    



    검색 결과



    sample.swift
    var text = "Swwwwift"
    var ans: [String] = []
    if text.pregMatche(pattern: "S(w+)ift", matches: &ans) {
        print("マッチしました")
    } else {
        print("マッチしていません")
    }
    print(ans)
    



    대체



    sample.swift
    var text = "SwwwwiftLove"
    let ans = text.pregReplace(pattern: "Sw*ift", with: "")
    print(ans)
    



    소스 코드



    함수 이름 등 자유롭게 변경하십시오.

    StringExt.swift
    import Foundation
    
    extension String {
        //絵文字など(2文字分)も含めた文字数を返します
        var length: Int {
            let string_NS = self as NSString
            return string_NS.length
        }
    
        //正規表現の検索をします
        func pregMatche(pattern: String, options: NSRegularExpression.Options = []) -> Bool {
            guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else {
                return false
            }
            let matches = regex.matches(in: self, options: [], range: NSMakeRange(0, self.length))
            return matches.count > 0
        }
    
        //正規表現の検索結果を利用できます
        func pregMatche(pattern: String, options: NSRegularExpression.Options = [], matches: inout [String]) -> Bool {
            guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else {
                return false
            }
            let targetStringRange = NSRange(location: 0, length: self.length)
            let results = regex.matches(in: self, options: [], range: targetStringRange)
            for i in 0 ..< results.count {
                for j in 0 ..< results[i].numberOfRanges {
                    let range = results[i].range(at: j)
                    matches.append((self as NSString).substring(with: range))
                }
            }
            return results.count > 0
        }
    
        //正規表現の置換をします
        func pregReplace(pattern: String, with: String, options: NSRegularExpression.Options = []) -> String {
            let regex = try! NSRegularExpression(pattern: pattern, options: options)
            return regex.stringByReplacingMatches(in: self, options: [], range: NSMakeRange(0, self.length), withTemplate: with)
        }
    }
    

    참고로 한 기사



    Swift 정규식 정보

    Swift (2.1)에서 똑같이 정규식을 만져 보았다 Qiita

    Swift의 정규식 예제

    Swift 정규식을 사용하여 지정한 <img src를 추출하고 싶습니다. teratail

    봐 주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기