前提・実現したいこと
実現したいこととしては"第2月曜日"・"第3木曜日"などの
"第○□曜日"のフォーマットの文字列から、今日を基準にして次にくる"第○□曜日"の
日付をDate型で求めたいのですが、実現方法がわかりませんでした。
前提として"第○□曜日"のフォーマットから
正規表現を使って○と□の部分を抽出してからInt型に変換するところまでは出来ています。
例:
第2月曜日 → ○ = 2 , □ = 1
第3木曜日 → ○ = 3 , □ = 5
今日が2018/10/30なので
次にくる第2月曜日は2018/11/12
次にくる第1木曜日は2018/11/1
と言った具合でこれらをDate型で求めたいです。
宜しくお願い致します。
該当のソースコード
Swift
1let day = "第2月曜日" 2 3if day.pregMatche(pattern: "第([1-5])(.曜日)"){ 4 let pattern = "第([1-5])(.)曜日" 5 let capture = day.capture(pattern:pattern, group: [1, 2]) 6 7 if !capture.isEmpty{ 8 //第何週目何曜日か取得 9 let ordinal = capture[0] 10 let week = capture[1] 11 12 if let weekValue = getWeekValue(week){ 13 print("(ordinal),(week)") 14 15 //解決後の追記コード 16 let date = Date() 17 let calendar = Calendar(identifier: .gregorian) 18 var dateComponents = DateComponents() 19 dateComponents.weekday = Int(week) 20 dateComponents.weekdayOrdinal = Int(ordinal) 21 22 let nextDate = calendar.nextDate(after: date, matching: dateComponents, matchingPolicy: .nextTime, repeatedTimePolicy: .first, direction: .forward)! 23 } 24 }else{ 25 fatalError() 26 } 27} 28 29func getWeekValue(week:String)->Int?{ 30 switch week { 31 case "日": 32 return 1 33 case "月": 34 return 2 35 case "火": 36 return 3 37 case "水": 38 return 4 39 case "木": 40 return 5 41 case "金": 42 return 6 43 case "土": 44 return 7 45 default: 46 return nil 47 } 48}
extension String { /// 正規表現でキャプチャした文字列を抽出する /// /// - Parameters: /// - pattern: 正規表現 /// - group: 抽出するグループ番号(>=1) /// - Returns: 抽出した文字列 func capture(pattern: String, group: Int) -> String? { let result = capture(pattern: pattern, group: [group]) return result.isEmpty ? nil : result[0] } /// 正規表現でキャプチャした文字列を抽出する /// /// - Parameters: /// - pattern: 正規表現 /// - group: 抽出するグループ番号(>=1)の配列 /// - Returns: 抽出した文字列の配列 func capture(pattern: String, group: [Int]) -> [String] { guard let regex = try? NSRegularExpression(pattern: pattern) else { return [] } guard let matched = regex.firstMatch(in: self, range: NSRange(location: 0, length: self.count)) else { return [] } return group.map { group -> String in return (self as NSString).substring(with: matched.range(at: group)) } } //正規表現の検索をします 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.count)) return matches.count > 0 } }
回答2件
あなたの回答
tips
プレビュー