Actions
Bug #12584
closedRegexp using repetition with alternation doesn't match greedily
Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
Description
正規表現で選択子 |
の外側で最大量指定子 *
による繰り返しを行った場合、最大でない部分文字列にマッチしてしまうことがあるようです。
以下に再現例を示します。
ある文字列から、「区切り文字d
以外の文字/[^d]/
」と「エスケープされた区切り文字/ed/
」からなる部分文字列を抽出することを考えます。
次の例では、文字列全体にマッチするべきであるにもかかわらず、前半部分にしかマッチしていません。
"---ed---".match(/(?:[^d]|ed)*/)
# => #<MatchData "---e">
次の例のように、カッコ内の|
の前後を入れ替えると、期待した通りに動きます。
"---ed---".match(/(?:ed|[^d])*/)
# => #<MatchData "---ed---">
この挙動がMac の以下の3つのバージョンで再現することを確認しました。
- ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
- ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
- ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin15.5.0]
以上、よろしくお願いします。
Actions
Like0
Like0Like0