diff --git a/lib/flagsmith/engine/segments/models.rb b/lib/flagsmith/engine/segments/models.rb index c5d8079..73023d8 100644 --- a/lib/flagsmith/engine/segments/models.rb +++ b/lib/flagsmith/engine/segments/models.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true +require 'strscan' require_relative 'constants' module Flagsmith @@ -45,7 +46,9 @@ class Condition CONTAINS => ->(other_value, self_value) { other_value.is_a?(String) && other_value.include?(self_value) }, NOT_CONTAINS => ->(other_value, self_value) { other_value.is_a?(String) && !other_value.include?(self_value) }, - REGEX => ->(other_value, self_value) { (other_value || false) && other_value.to_s.match?(self_value) } + REGEX => lambda { |other_value, self_value| + (other_value || false) && !StringScanner.new(other_value.to_s).match?(Regexp.new(self_value)).nil? + } }.freeze def initialize(operator:, value:, property: nil) diff --git a/spec/engine/unit/segments/models_spec.rb b/spec/engine/unit/segments/models_spec.rb index c534e79..14f0a51 100644 --- a/spec/engine/unit/segments/models_spec.rb +++ b/spec/engine/unit/segments/models_spec.rb @@ -75,6 +75,18 @@ ['REGEX', 'foo', /[a-z]+/, true], ['REGEX', 'FOO', /[a-z]+/, false], ['REGEX', '1.2.3', /\d/, true], + ['REGEX', 'production', 'prod', true], + ['REGEX', 'nonproduction', 'prod', false], + ['REGEX', 'development', 'prod|dev', true], + ['REGEX', 'nondevelopment', 'prod|dev', false], + ['REGEX', 'jane@example.com', '@example\.com$', false], + ['REGEX', 'jane@example.com', '[a-z]+@example\.com$', true], + ['REGEX', 'production-eu', '^production$', false], + ['REGEX', 'Production', 'prod', false], + ['REGEX', 'Production', '[Pp]rod', true], + ['REGEX', 'v1.2', 'v\d', true], + ['REGEX', 'release-v1.2', 'v\d', false], + ['REGEX', 123, '\d*[13579]$', true], ['EQUAL', '1.0.0', '1.0.0:semver', true], ['EQUAL', '1.0.0', '1.0.1:semver', false],