Swiftの正規表現について調べました。
旧式の NSRegularExpression を使う方法もありますが、今回は iOS 16.0 から使用可能な Swift Regex を使った方法についてまとめます。
マッチするか
文字列やRegexの wholeMatch(of:)
メソッドを呼び出します。
let text = "18時30分"
let regex = /\d+時\d+分/
if let match = text.wholeMatch(of: regex) {
print(match.0)
} else {
print("マッチしなかった")
}
// [出力]
// 18時30分
マッチ に関する主要なメソッドを表示
let text = "18時30分", regex = /\d+時\d+分/
var match: Regex<Substring>.Match?
var bool: Bool
// 全体がマッチするか
match = text.wholeMatch(of: regex)
// 先頭がマッチするか
bool = text.starts(with: regex)
match = text.prefixMatch(of: regex) ?? nil
検索
文字列の matches(of:)
メソッドを呼び出します。
let text = "現在の時刻は18時30分、ロンドンでは9時30分です。"
let regex = /\d+時\d+分/
let matches = text.matches(of: regex)
for match in matches {
print(match.0)
}
// [出力]
// 18時30分
// 9時30分
検索 に関する主要なメソッドを表示
let text = "18時30分", regex = /\d+時\d+分/
var matches: [Regex<Substring>.Match]
var match: Regex<Substring>.Match?
var bool: Bool
// マッチするもの全て
matches = text.matches(of: regex)
// 最初にマッチするもの
match = text.firstMatch(of: regex) ?? nil
// マッチするものを含むか
bool = text.contains(regex)
置換
文字列の replace(_:with:)
メソッドを呼び出します。
var text = "現在の時刻は18時30分、ロンドンでは9時37分です。"
let regex = /\d+時\d+分/
text.replace(regex, with: "xxx")
print(text) // 現在の時刻はxxx、ロンドンではxxxです。
キャプチャした値を使って置き換えることもできます。
var text = "現在の時刻は18時30分、ロンドンでは9時37分です。"
let regex = /(\d+)時(\d+)分/
text.replace(regex) { match in
"\(match.1):\(match.2)"
}
print(text) // 現在の時刻は18:30、ロンドンでは9:37です。
置換 や その他 の主要なメソッドを表示
let text = "18時30分", regex = /\d+時\d+分/
var string: String
var subString: String.SubSequence
var subStrings: [String.SubSequence]
// 置換
string = text.replacing(regex, with: "xxx")
// マッチした前半部分を取り除く
subString = text.trimmingPrefix(regex)
// 分割
subStrings = text.split(separator: regex)
Regexの生成について
この記事では /
で囲ったリテラルで正規表現を生成しましたが、他の書き方についても別の記事でまとめたので、ぜひ読んでみてください。
参考