名前付きグループとアンカー
高度な正規表現です。
「名前付きグループとアンカー」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
名前付きグループを使う理由
パターンが大きくなると、m[1]のような番号付きキャプチャは読みにくくなります。名前付きグループを使うと、各キャプチャに意味のある名前を付けられます。
構文は(?<name>pattern)です。
m = /(?<year>\d{4})-(?<month>\d{2})/.match('2026-05')
puts(m[:year])
puts(m[:month])名前付きキャプチャにアクセスする
名前付きキャプチャには、SymbolまたはStringのキーでアクセスできます。m[:name]のように記述します。named_capturesメソッドを使うと、すべてをHashとして取得できます。
m = /(?<user>\w+)@(?<host>\w+)/.match('alice@mail')
p m.named_captures=~と名前付きグループ
名前付きグループを含む正規表現リテラルを=~の左辺に置くと、Rubyは各名前に対応するローカル変数を自動的に作成します。
if /(?<word>\w+)/ =~ 'hello'
puts word
endアンカー:先頭と末尾
アンカーは文字ではなく位置にマッチします。
^は行の先頭$は行の末尾
入力全体がマッチすることを検証するうえで重要です。
puts(/^abc/.match?('abcdef'))
puts(/def$/.match?('abcdef'))
puts(/^abc$/.match?('abcdef'))文字列アンカー \Aと\z
^と$は行の境界にマッチするため、複数行の文字列では注意が必要です。文字列全体を対象にする場合は、\A(先頭)と\z(末尾)を使うことをおすすめします。
text = "first\nsecond"
puts(/^second/.match?(text))
puts(/\Asecond/.match?(text))入力全体を検証する
文字列全体がある形式に一致することを確認するには、両端にアンカーを付けます。これにより、余分な文字を含む文字列を拒否できます。
zip = /\A\d{5}\z/
puts(zip.match?('34000'))
puts(zip.match?('34000x'))単語境界
\bは単語境界です。単語文字と単語文字以外の文字の間にある位置を表します。文字を消費せずに単語全体にマッチします。
puts('cat catalog'.scan(/\bcat\b/).length)
puts('cat catalog'.scan(/cat/).length)先読み
肯定先読み(?=...)は、次に続く内容をマッチに含めずに検証します。否定先読みは(?!...)です。
puts('100 dollars'.match(/\d+(?= dollars)/)[0])
puts('apple pie'.match?(/apple(?! juice)/))後読み
後読み(?<=...)は、マッチの前にある内容を検証します。否定後読みは(?<!...)です。
m = '$42'.match(/(?<=\$)\d+/)
puts(m[0])非キャプチャグループ
選択や量指定子のためにグループ化が必要でも、キャプチャはしたくない場合があります。そのときは(?:...)を非キャプチャグループとして使います。
m = /(?:Mr|Ms)\. (\w+)/.match('Ms. Lee')
p m.capturesすべてを組み合わせる
実用的なバリデーターでは、アンカー、名前付きグループ、量指定子を組み合わせて使います。
re = /\A(?<area>\d{3})-(?<num>\d{4})\z/
m = re.match('555-1234')
puts(m[:area])
puts(m[:num])簡単な確認
文字列全体がマッチすることを、改行を無視して確認するには、どのアンカーを使うべきですか。
まとめ:名前付きグループとアンカー
高度な正規表現の機能を習得しました。
- 名前付きグループ
(?<name>...)とnamed_captures - アンカー
^ $ \A \z \b - 先読み
(?=)/(?!)と後読み(?<=)/(?<!) - 非キャプチャグループ
(?:...)
puts(/\A(?<id>\d+)\z/.match('42')[:id])よくある質問
「名前付きグループとアンカー」レッスンは無料ですか?
はい。「名前付きグループとアンカー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「名前付きグループとアンカー」で何を学びますか?
高度な正規表現です。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「名前付きグループとアンカー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 正規表現リテラル
- マッチングとキャプチャ
- 置換
- 名前付きグループとアンカー