Skip to content

Commit bf308bb

Browse files
Watson1978claude
andcommitted
MatchData: match と match_length を追加 (Ruby 3.1)
どちらも Ruby 3.1 で追加されたメソッド。実機で確認し #@SInCE 3.1 で分岐した。 MatchData#match 単一グループにマッチした部分文字列 MatchData#match_length 単一グループにマッチした部分文字列の長さ (文字数) 配置は関連する MatchData#[] 群の後、MatchData#begin の前にした。 match は MatchData#[] と似ているが、範囲や複数要素の指定はできず単一グループ だけを返す点を書いた。match_length の長さは文字数で数えることを、 ひらがな 3 文字の例 (match_length(1) が 3) で示した。どちらもマッチしていない グループでは nil、範囲外の数値や存在しない名前では IndexError になる。 bitclust のデータベース生成を 3.0 / 3.1 / 3.4 / 4.0 で実行してエラーが出ないこと、 登録されるメソッドが 0 / 2 / 2 / 2 件と 3.1 追加どおりになることを確認済み。 サンプルコードは対象の全バージョンで実行して出力を確認した。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 5bcc2e4 commit bf308bb

1 file changed

Lines changed: 54 additions & 0 deletions

File tree

manual/api/_builtin/MatchData.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,60 @@ p /\$(?<dollars>\d+)\.(?<cents>\d+)/.match("$3.67")[:cents] # => "67"
6868
p /(?<alpha>[a-zA-Z]+)|(?<num>\d+)/.match("aZq")[:num] # => nil
6969
```
7070

71+
#@since 3.1
72+
### def match(n) -> String | nil
73+
### def match(name) -> String | nil
74+
75+
n 番目、または name という名前のグループにマッチした部分文字列を返します。
76+
77+
[m:MatchData#\[\]] と似ていますが、範囲や複数要素の指定はできず、
78+
単一のグループに対応する部分文字列だけを返します。
79+
マッチしていないグループを指定した場合は nil を返します。
80+
81+
- **param** `n` -- 返す部分文字列のインデックスを 0 以上の整数で指定します。
82+
0 はマッチ全体を意味します。
83+
- **param** `name` -- 名前付きグループの名前を [c:String][c:Symbol] で指定します。
84+
- **raise** `IndexError` -- 範囲外の n や、存在しない name を指定した場合に発生します。
85+
86+
```ruby title="例"
87+
m = /(.)(.)(\d+)(\d)(\w)?/.match("THX1138.")
88+
p m.match(0) # => "HX1138"
89+
p m.match(4) # => "8"
90+
p m.match(5) # => nil
91+
92+
m = /(?<foo>.)(.)(?<bar>.+)/.match("hoge")
93+
p m.match(:foo) # => "h"
94+
p m.match(:bar) # => "ge"
95+
```
96+
97+
- **SEE** [m:MatchData#\[\]], [m:MatchData#match_length]
98+
99+
### def match_length(n) -> Integer | nil
100+
### def match_length(name) -> Integer | nil
101+
102+
n 番目、または name という名前のグループにマッチした部分文字列の長さを
103+
文字数で返します。
104+
105+
マッチしていないグループを指定した場合は nil を返します。
106+
107+
- **param** `n` -- 対象の部分文字列のインデックスを 0 以上の整数で指定します。
108+
0 はマッチ全体を意味します。
109+
- **param** `name` -- 名前付きグループの名前を [c:String][c:Symbol] で指定します。
110+
- **raise** `IndexError` -- 範囲外の n や、存在しない name を指定した場合に発生します。
111+
112+
```ruby title="例"
113+
m = /(.)(.)(\d+)(\d)(\w)?/.match("THX1138.")
114+
p m.match_length(0) # => 6
115+
p m.match_length(4) # => 1
116+
p m.match_length(5) # => nil
117+
118+
# 長さは文字数で数える
119+
p /(\p{Hiragana}+)/.match("あいう").match_length(1) # => 3
120+
```
121+
122+
- **SEE** [m:MatchData#match]
123+
#@end
124+
71125
### def begin(n) -> Integer | nil
72126

73127
n 番目の部分文字列先頭のオフセットを返します。

0 commit comments

Comments
 (0)