diff --git a/lib/capybara/selector/regexp_disassembler.rb b/lib/capybara/selector/regexp_disassembler.rb index 02fb3a08..3c00e603 100644 --- a/lib/capybara/selector/regexp_disassembler.rb +++ b/lib/capybara/selector/regexp_disassembler.rb @@ -100,6 +100,8 @@ module Capybara def extract_strings(process_alternatives) strings = [] each do |exp| + next if exp.ignore? + next strings.push(nil) if exp.optional? && !process_alternatives next strings.push(exp.alternative_strings) if exp.alternation? && process_alternatives @@ -159,6 +161,11 @@ module Capybara alts.all?(&:any?) ? Set.new(alts) : nil end + def ignore? + [Regexp::Expression::Assertion::NegativeLookahead, + Regexp::Expression::Assertion::NegativeLookbehind].any? { |klass| @exp.is_a? klass } + end + private def indeterminate? diff --git a/spec/regexp_dissassembler_spec.rb b/spec/regexp_dissassembler_spec.rb index 59dfcfd2..ef9d8170 100644 --- a/spec/regexp_dissassembler_spec.rb +++ b/spec/regexp_dissassembler_spec.rb @@ -212,6 +212,16 @@ RSpec.describe Capybara::Selector::RegexpDisassembler, :aggregate_failures do ) end + it 'ignores negative lookaheads' do + verify_strings( + /^(?!.*\bContributing Editor\b).*$/ => %w[], + /abc(?!.*def).*/ => %w[abc], + /(?!.*def)abc/ => %w[abc], + /abc(?!.*def.*).*ghi/ => %w[abc ghi], + /abc(?!.*bcd)def/ => %w[abcdef] + ) + end + it 'handles anchors' do verify_strings( /^abc/ => %w[abc],