Swift正規表現入門!Regex BuilderとNSRegularExpressionを初心者向けに解説
生徒
「Swiftで文字列の中から特定のパターンを探したいんですけど、どうすればいいですか?」
先生
「それには正規表現(せいきひょうげん)という便利な方法を使います。SwiftにはRegex BuilderやNSRegularExpressionといった仕組みがあり、文字列の中からメールアドレスや電話番号など特定の形を見つけることができます。」
生徒
「なんだか難しそうですね…。プログラミング初心者でも使えるんですか?」
先生
「大丈夫です。身近な例を交えながら、わかりやすく説明していきますよ!」
1. 正規表現とは?
正規表現とは「文字のパターンを表現する方法」です。例えば、「数字だけを探したい」「メールアドレスっぽい文字を見つけたい」といったときに使います。正規表現を使うと、単なる文字検索では難しい複雑な条件を一発で判定できます。
イメージとしては、郵便物を仕分けするときの「ルール表」のようなものです。「住所に東京都と書いてあればこの箱に入れる」といった感じで、文字列を自動でチェックできます。
2. SwiftのRegex Builderを使う
Swift 5.7からはRegex Builderという新しい書き方が追加されました。これを使うと、従来の難解な記号だらけの正規表現を、読みやすく組み立てられます。
import RegexBuilder
let pattern = Regex {
OneOrMore(.digit)
}
let text = "電話番号は12345です"
if let match = text.firstMatch(of: pattern) {
print(match.0)
}
このコードは、文字列の中から「数字が連続している部分」を探します。結果として「12345」が見つかります。
12345
OneOrMore(.digit)は「数字が1回以上」という意味です。直感的に書けるので初心者でもわかりやすいのが特徴です。
3. NSRegularExpressionを使う
NSRegularExpressionは昔からある正規表現の仕組みです。少し難しそうに見えますが、まだまだ現場ではよく使われています。
import Foundation
let text = "メールはsample@example.comです"
let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let regex = try! NSRegularExpression(pattern: pattern)
let matches = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))
for match in matches {
if let range = Range(match.range, in: text) {
print(text[range])
}
}
この例では「メールアドレスっぽい文字列」を探しています。実行すると「sample@example.com」が抽出されます。
sample@example.com
正規表現のパターンは一見複雑ですが、「@の前後に英数字があって、最後にドットとアルファベットが続く」というルールを表しています。
4. Regex BuilderとNSRegularExpressionの違い
ここまで紹介した2つの方法には次のような違いがあります。
- Regex Builder: Swift専用の新しい書き方。読みやすく初心者にも理解しやすい。
- NSRegularExpression: 古くからある方法。複雑なパターンも自由に書けるが、記号が多くて難しく感じやすい。
初心者の方はまずRegex Builderを使い、既存のコードや他のエンジニアが書いたサンプルを見るときにNSRegularExpressionも覚えるとよいでしょう。
5. 実生活にたとえて理解しよう
正規表現は一見難しそうですが、身近な例に置き換えると理解しやすいです。例えばスーパーで「値札に100円と書かれている商品だけを選びたい」というとき、数字の部分だけを見つけて判断します。これが「数字を探す正規表現」です。また、「@マークが入っている文字列だけを探す」のは「メールアドレスを見つける正規表現」です。
つまり、正規表現は大量の文字の中から「必要なものだけをフィルターにかける仕組み」だと考えるとイメージしやすいでしょう。
6. まとめて実践コード
最後にRegex BuilderとNSRegularExpressionをまとめて比較できるサンプルコードを紹介します。
import Foundation
import RegexBuilder
let text = "ユーザーID: abc123, メール: test@example.com"
// Regex Builderで数字を抽出
let numberPattern = Regex { OneOrMore(.digit) }
if let match = text.firstMatch(of: numberPattern) {
print("数字: \(match.0)")
}
// NSRegularExpressionでメールを抽出
let mailPattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
let regex = try! NSRegularExpression(pattern: mailPattern)
let matches = regex.matches(in: text, range: NSRange(text.startIndex..., in: text))
for match in matches {
if let range = Range(match.range, in: text) {
print("メール: \(text[range])")
}
}
このコードでは「数字」と「メールアドレス」の両方を抽出できます。
数字: 123
メール: test@example.com