今回は、Swift で文字列に含まれている URL を抽出する方法を簡単にまとめていこかと思います🙃
結論
下記のように NSDataDetector
というクラスを使用して、テキストからリンクを抽出することができます。
func getLinkTextList(text: String) -> [String] { guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else { return [] } let enableLinkTuples = detector.matches(in: text, range: NSRange(location: 0, length: text.count)) return enableLinkTuples.map { checkingResult -> String in return (text as NSString).substring(with: checkingResult.range) } } let linkString = getLinkTextList(text: "僕の記事はこちら👉 https://yamato8010.hatenablog.com/").first! print(linkString) // 出力: https://yamato8010.hatenablog.com
NSDataDetector とは?
自然言語テキストに対して、事前定義されたデータパターンに一致する特殊な正規表現を検出するためのオブジェクトで、日付・住所・リンク・電話番号・通過情報などを照合することができます。
一致するコンテンツの結果は、NSTextCheckingResult
として返されます。ただし、NSDataDetector によって返される NSTextCheckingResult
オブジェクトは、NSDataDetector が継承している NSRegularExpression
によって返されるオブジェクトとは異なるようで、NSDataDetector は、返される結果のタイプに対応するプロパティがあるそうです。
基本的には、NSRegularExpression の上位互換なので、パターンマッチングしたい時は、NSDataDetector を使用する。という感じで大丈夫そうです。
NSTextCheckingResult.CheckingType の種類
iOS13 現在では、下記のようなタイプを NSDataDetector の初期化時に(NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue)) 使用することができます。
type | 内容 |
---|---|
orthography | 言語を特定します。結果は、orthography でアクセスでき、NSOrthography の値が渡されます。 |
spelling | スペルのチェックをします。 |
grammar | 文法のチェックをします。 |
date | 日付を見つけます。結果は、date プロパティでアクセスすることができます。 |
address | アドレスを見つけます。 |
url | リンクを見つけます。 |
quote | 引用符をスマート符に置き換えます。 |
dash | dash を em-dashes に置き換えます。 |
replacement | (c) などの文字を適切な記号に置き換えます。(この場合は、©︎) |
correction | スペルミスのある単語に対して自動修正を実行します。 |
regularExpression | 正規表現と照合します。 |
phoneNumber | 電話番号と照合します。 |
transitInformation | フライト情報など、トランジット情報と照合します。 |