lib/regexp_parser/expression/base.rb
module Regexp::Expression
class Base
include Regexp::Expression::Shared
def initialize(token, options = {})
init_from_token_and_options(token, options)
end
def to_re(format = :full)
if set_level > 0
warn "Calling #to_re on character set members is deprecated - "\
"their behavior might not be equivalent outside of the set."
end
::Regexp.new(to_s(format))
end
def quantify(*args)
self.quantifier = Quantifier.new(*args)
end
def unquantified_clone
clone.tap { |exp| exp.quantifier = nil }
end
# Deprecated. Prefer `#repetitions` which has a more uniform interface.
def quantity
return [nil,nil] unless quantified?
[quantifier.min, quantifier.max]
end
def repetitions
@repetitions ||=
if quantified?
min = quantifier.min
max = quantifier.max < 0 ? Float::INFINITY : quantifier.max
range = min..max
# fix Range#minmax on old Rubies - https://bugs.ruby-lang.org/issues/15807
if RUBY_VERSION.to_f < 2.7
range.define_singleton_method(:minmax) { [min, max] }
end
range
else
1..1
end
end
def greedy?
quantified? and quantifier.greedy?
end
def reluctant?
quantified? and quantifier.reluctant?
end
alias :lazy? :reluctant?
def possessive?
quantified? and quantifier.possessive?
end
def to_h
{
type: type,
token: token,
text: to_s(:base),
starts_at: ts,
length: full_length,
level: level,
set_level: set_level,
conditional_level: conditional_level,
options: options,
quantifier: quantified? ? quantifier.to_h : nil,
}
end
alias :attributes :to_h
end
end