正規表現を学んでみる
はじめに
Swift5の新機能でStringの“や\などの特殊文字を使う際に今までは\をつける必要があったが#で囲めば大丈夫になったらしい。
何が嬉しいのかあまりわからかったが、この記事によるとこの追加機能のおかげで正規表現を効率的にかけるようになったらしい。
いままで正規表現をほとんど使わずコピペで済ませてきたので初歩の初歩からやってみる。
文字列のマッチング
まずは文字列の中にaが入っているのかどうかを調べてみる。正規表現では文字列が含まれていることをマッチするというらしい。
[]
[]は文字クラスというものらしく、[]の中にある文字(今回はa)のどれかという意味らしい。[abc]とするとaかbかc出会った場合にprintされる
let text = "aaa"
let pattern = "[a]"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let matches = regex.matches(in: text, options: [], range: NSMakeRange(0, text.count))
if matches.count > 0 {
print("マッチしたよ")
}
()
()も同じく文字クラスらしくカッコ内の文字列をひとつのグループとして管理するものらしい。[]と置き換えてもマッチした。
let text = "aaa"
let pattern = "(a)"
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let matches = regex.matches(in: text, options: [], range: NSMakeRange(0, text.count))
if matches.count > 0 {
print("マッチしたよ!")
}
マッチした文字情報の取得
[“a”, “a”, “a”]と出力されます。
let text = "aaa"
let pattern = "[a]"
var value: [String] = []
let regex = try! NSRegularExpression(pattern: pattern, options: [])
let results = regex.matches(in: text, options: [], range: NSMakeRange(0, text.count))
for i in 0 ..< results.count {
for j in 0 ..< results[i].numberOfRanges {
let range = results[i].range(at: j)
value.append((text as NSString).substring(with: range))
}
}
print(value)
ASCIIコードの変換
以前にも紹介しましたがstackOverflowにあったASCIIコードをStringに変換する為の正規表現を用いたマッチング
実行すると[“H”, “E”, “L”, “L”, “O”]と出力されますcharactersをStringでキャストするとHELLOになります。
let text = "0x480x450x4c0x4c0x4f"
let pattern = "(0x)?([0-9a-f]{2})"
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let nsString = text as NSString
let range = NSRange(location: 0, length: nsString.length)
let matches = regex.matches(in: text, options: [], range: range)
let characters = matches.map {
Character(UnicodeScalar(UInt32(nsString.substring(with: $0.range(at: 2)), radix: 16)!)!)
}
print(characters)