正規表現リテラルとマッチング
Regex型でパターンにマッチさせます。
「正規表現リテラルとマッチング」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
Swift の正規表現
Swift 5.7 以降では、標準ライブラリと Foundation にネイティブの正規表現が用意されています。正規表現を /\d+/ のようにスラッシュで囲んだリテラルとして記述でき、コンパイラーがビルド時にチェックします。
正規表現リテラル
正規表現リテラルは Regex 値を生成します。その型には、マッチによって得られる値が反映されます。最も単純なパターンは、固定された文字列にマッチします。
let pattern = /hello/
if "hello world".contains(pattern) {
print("Found hello")
}wholeMatch(of:)
wholeMatch(of:) は、文字列全体がパターンにマッチした場合にのみ成功します。マッチ結果を Optional で返し、文字列全体がマッチしなければ nil を返します。
let digits = /\d+/
if let m = "12345".wholeMatch(of: digits) {
print("Whole match: \(m.output)")
} else {
print("No whole match")
}firstMatch(of:)
firstMatch(of:) は文字列を検索し、パターンが文字列内のどこかでマッチする最初の位置を返します。
let word = /\w+/
if let m = " swift rocks".firstMatch(of: word) {
print("First word: \(m.output)")
}マッチ範囲へのアクセス
マッチ結果には元の文字列内の range が含まれるため、どこでマッチしたかを正確に把握できます。
let text = "abc123def"
if let m = text.firstMatch(of: /\d+/) {
print("Matched: \(m.output)")
print("At: \(text[m.range])")
}文字クラス
パターン内では、\d は数字、\w はワード文字、\s は空白文字にマッチします。角括弧を使うと、[aeiou] のように独自の文字集合を定義できます。
let vowel = /[aeiou]/
if let m = "sky".firstMatch(of: vowel) {
print("Vowel: \(m.output)")
} else {
print("No vowels found")
}量指定子
量指定子は繰り返しを制御します。* は 0 回以上、+ は 1 回以上、? は省略可能、{n,m} は範囲を指定した回数を表します。
let phone = /\d{3}-\d{4}/
print("555-1234".wholeMatch(of: phone) != nil)
print("12-34".wholeMatch(of: phone) != nil)アンカー
行の先頭には ^、行末には $ を使って位置を固定します。アンカーは文字を消費せず、位置を表明します。
let startsWithCap = /^[A-Z]\w*/
if let m = "Swift".firstMatch(of: startsWithCap) {
print("Matched: \(m.output)")
}大文字と小文字を区別しないマッチング
正規表現の値に .ignoresCase() を追加すると、大文字と小文字を区別しなくなります。入力の大文字・小文字が予測できない場合に便利です。
let pattern = /swift/.ignoresCase()
print("I love SWIFT".contains(pattern))matches(of:) によるマッチング
matches(of:) は、文字列内の重複しないすべてのマッチをコレクションとして返すため、すべてのマッチを反復処理できます。
let nums = "a1 b22 c333"
for m in nums.matches(of: /\d+/) {
print(m.output)
}入力の検証
よくある用途が入力の検証です。期待する形式全体に対応するパターンを作成し、wholeMatch で確認します。一致しない場合は nil が返されます。
func isZip(_ s: String) -> Bool {
s.wholeMatch(of: /\d{5}/) != nil
}
print(isZip("90210"))
print(isZip("ABCDE"))クイックチェック
文字列全体がマッチした場合にのみ成功するメソッドはどれですか?
まとめ
スラッシュで囲んだ正規表現リテラルの記述方法と、wholeMatch(of:)、firstMatch(of:)、matches(of:) を使ったマッチングを学びました。文字クラス、量指定子、アンカー、大文字と小文字を区別しないマッチングについても確認しました。次は、キャプチャグループを使ってマッチ結果からデータを取り出します。
よくある質問
「正規表現リテラルとマッチング」レッスンは無料ですか?
はい。「正規表現リテラルとマッチング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「正規表現リテラルとマッチング」で何を学びますか?
Regex型でパターンにマッチさせます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「正規表現リテラルとマッチング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 正規表現リテラルとマッチング
- キャプチャグループ
- RegexBuilder DSL
- テキストの置換と分割