class Cucumber::CucumberExpressions::TreeRegexp
def create_group_builder(regexp)
def create_group_builder(regexp) = regexp.source = [GroupBuilder.new] start_stack = [] ng = false lass = false .each_char.with_index do |c, i| == '[' && !escaping ar_class = true f c == ']' && !escaping ar_class = false f c == '(' && !escaping && !char_class oup_start_stack.push(i) oup_builder = GroupBuilder.new n_capturing = is_non_capturing(source, i) oup_builder.set_non_capturing! if non_capturing ack.push(group_builder) f c == ')' && !escaping && !char_class = stack.pop oup_start = group_start_stack.pop gb.capturing? gb.source = source[group_start + 1...i] stack.last.add(gb) se gb.move_children_to(stack.last) d ping = c == '\\' && !escaping pop
def initialize(regexp)
def initialize(regexp) @regexp = regexp.is_a?(Regexp) ? regexp : Regexp.new(regexp) @group_builder = create_group_builder(@regexp) end
def is_non_capturing(source, i)
def is_non_capturing(source, i) x is valid. Bounds check not required. rce[i + 1] != '?' ) rn false rce[i + 2] != '<' :X) idmsuxU-idmsuxU) idmsux-idmsux:X) =X) !X) >X) rn true rce[i + 3] == '=' || source[i + 3] == '!' <=X) <!X) rn true ame>X) CucumberExpressionError.new('Named capture groups are not supported. See https://github.com/cucumber/cucumber/issues/329')
def match(s)
def match(s) match = @regexp.match(s) return nil if match.nil? group_indices = (0..match.length).to_a.to_enum @group_builder.build(match, group_indices) end