LoginSignup
1
1

More than 1 year has passed since last update.

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

Posted at

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

ポイント

  • カッコ () で文字をキャプチャする
  • バックスラッシュと数字 ( \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">

参考

チャットメンバー募集

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

Twitter

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1