今日の今日まで知らなかった正規表現
キャプチャした文字は置換だけではなく、同じマッチの中でも利用できる
ポイント
- カッコ
()
で文字をキャプチャする - バックスラッシュと数字 (
\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オープンチャットもご利用ください。