キャプチャグループ
マッチ結果から部分文字列を取り出します。
「キャプチャグループ」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
キャプチャグループ
正規表現内の括弧はキャプチャグループを作成します。各グループはマッチした部分文字列を保持するため、大きなマッチ結果から構造化された部分を取り出せます。
1 つのキャプチャ
パターンの一部を () で囲むと、その部分をキャプチャできます。マッチ結果はタプルになり、最初に全体のマッチ結果、その後に各キャプチャが並びます。
if let m = "v2".firstMatch(of: /v(\d+)/) {
print("Whole: \(m.0)")
print("Group: \(m.1)")
}複数のキャプチャ
括弧の組を追加するたびに、左から右の順序で出力タプルに要素が追加されます。
if let m = "2024-05-30".wholeMatch(of: /(\d{4})-(\d{2})-(\d{2})/) {
print("Year: \(m.1)")
print("Month: \(m.2)")
print("Day: \(m.3)")
}全体のマッチ結果は .0
出力の .0 要素は常にマッチしたテキスト全体です。キャプチャは .1 から始まります。
if let m = "key=value".wholeMatch(of: /(\w+)=(\w+)/) {
print("Full: \(m.0)")
print("Key: \(m.1), Value: \(m.2)")
}キャプチャは部分文字列
デフォルトでは、キャプチャは元の文字列内を指す Substring 値です。保持する必要がある場合は String(...) で変換してください。
if let m = "abc123".firstMatch(of: /([a-z]+)(\d+)/) {
let letters = String(m.1)
let numbers = String(m.2)
print(letters, numbers)
}省略可能なキャプチャ
グループが省略可能(後ろに ? が付いている)な場合、マッチに含まれなければ、そのキャプチャは nil になることがあります。
if let m = "color".wholeMatch(of: /colou?(r)/) {
print("Captured: \(m.1)")
}名前付きキャプチャ
(?<name>...) を使ってグループに名前を付け、名前付き出力から読み取ることができます。数値インデックスよりも意図が明確になります。
let re = /(?<area>\d{3})-(?<line>\d{4})/
if let m = "555-1234".wholeMatch(of: re) {
print("Area: \(m.area)")
print("Line: \(m.line)")
}キャプチャの反復処理
キャプチャと matches(of:) を組み合わせると、多数のマッチ結果から構造化されたデータを一度に取り出せます。
let log = "a=1 b=2 c=3"
for m in log.matches(of: /(\w+)=(\d+)/) {
print("\(m.1) -> \(m.2)")
}ネストしたグループ
グループはネストできます。外側のグループは全体をキャプチャし、内側のグループは一部をキャプチャします。番号は開き括弧の順序に従います。
if let m = "12:30".wholeMatch(of: /((\d+):(\d+))/) {
print("All: \(m.1)")
print("H: \(m.2), M: \(m.3)")
}非キャプチャグループ
キャプチャせずにグループ化するには (?:...) を使います。量指定子のためにグループ化するだけで、タプルに追加の要素を含めたくない場合に便利です。
if let m = "abab".wholeMatch(of: /(?:ab)+/) {
print("Matched: \(m.0)")
}パーサーの作成
キャプチャを使うと、生のテキストを型付きの値に変換できます。ここでは、座標を表す文字列を整数として解析します。
func parsePoint(_ s: String) -> (Int, Int)? {
guard let m = s.wholeMatch(of: /(\d+),(\d+)/),
let x = Int(m.1), let y = Int(m.2) else { return nil }
return (x, y)
}
print(parsePoint("3,7") ?? "nil")クイックチェック
パターン /(\d{4})-(\d{2})/ で "2024-05" にマッチした場合、m.2 は何になりますか?
まとめ
括弧でキャプチャグループを作成し、.0 を全体のマッチ結果、.1、.2... を各キャプチャとするタプルとしてアクセスできることを学びました。名前付き、オプショナル、ネストした、非キャプチャの各グループについても確認しました。次は RegexBuilder を使って、読みやすい Swift コードから正規表現を作成します。
よくある質問
「キャプチャグループ」レッスンは無料ですか?
はい。「キャプチャグループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「キャプチャグループ」で何を学びますか?
マッチ結果から部分文字列を取り出します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「キャプチャグループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。