📌

正規表現のキャプチャでグループ化した同じ文字の繰り返しにマッチさせる (Ruby)

2023/01/08に公開

今日の今日まで知らなかった正規表現
キャプチャした文字は置換だけではなく、同じマッチの中でも利用できる

ポイント

  • カッコ () で文字をキャプチャする
  • バックスラッシュと数字 ( \1 とか \2 とか ) でマッチした文字を再利用できる

たとえば次の例では abc いずれか2文字の繰り返しにマッチする

aa はマッチする

"aa".match(/([abc])\1/)
# #<MatchData "aa" 1:"a">

ab は同じ文字の繰り返しではないのでマッチしない

"ab".match(/([abc])\1/)
# nil

文字種を問わずマッチさせるならキャプチャを使わずにこうだ
これは ab にもマッチする

"ab".match(/([abc]{2})/)
# #<MatchData "ab" 1:"ab">

応用例 - キャプチャ文字を離れた位置で利用する

キャプチャは直前文字に対してだけ使えるわけではない
いちどキャプチャしたら後は自由な位置で使える

"a-a".match(/([abc])-\1/)
# #<MatchData "a-a" 1:"a">

応用例 - 複数のキャプチャ

1番目のキャプチャは \1
2番目は \2 というように連番で利用できる

"ab ab".match(/([abc])([abc]) \1\2/)
# #<MatchData "ab ab" 1:"a" 2:"b">

応用例 - 複数のキャプチャ

直前の同じ文字の繰り返し

次の例は最初にキャプチャしたaの連続部分にだけマッチする

"aaaaaaaaaaaaabbbbbb".match(/([abc])\1*/)
# #<MatchData "aaaaaaaaaaaaa" 1:"a">

参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2fregexp.html

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

Discussion