Module: Recog::Fingerprint::RegexpFactory

Defined in:
lib/recog/fingerprint/regexp_factory.rb

Overview

Examples:

r = RegexpFactory.build("^Apache[ -]Coyote/(\d\.\d)$", "REG_ICASE")
r.match("Apache-Coyote/1.1")

Constant Summary collapse

FLAG_MAP =

Currently, only options relating to case insensitivity and multiline/newline are supported. Because Recog's data is used by tools written in different languages like Ruby and Java, we currently support specifying them in a variety of ways. This map controls how they can be specified.

TODO: consider supporting only a simpler variant and require that tools that use Recog data translate accordingly

{
  # multiline variations
  'REG_DOT_NEWLINE'   => Regexp::MULTILINE,
  'REG_LINE_ANY_CRLF' => Regexp::MULTILINE,
  'REG_MULTILINE'     => Regexp::MULTILINE,
  # case variations
  'REG_ICASE'         => Regexp::IGNORECASE,
  'IGNORECASE'        => Regexp::IGNORECASE
}
DEFAULT_FLAGS =
0

Class Method Summary collapse

Class Method Details

.build(pattern, flags) ⇒ Regexp

Returns:

  • (Regexp)

33
34
35
36
# File 'lib/recog/fingerprint/regexp_factory.rb', line 33

def self.build(pattern, flags)
  options = build_options(flags)
  Regexp.new(pattern, options)
end

.build_options(flags) ⇒ Fixnum

Convert string flag names as used in Recog XML into a Fixnum suitable for passing as the options parameter to Regexp.new

Parameters:

  • flags (Array<String>)

Returns:

  • (Fixnum)

    Flags for creating a regular expression object

See Also:


44
45
46
47
48
49
50
51
52
# File 'lib/recog/fingerprint/regexp_factory.rb', line 44

def self.build_options(flags)
  unsupported_flags = flags.select { |flag| !FLAG_MAP.key?(flag) }
  unless unsupported_flags.empty?
    fail "Unsupported regular expression flags found: #{unsupported_flags.join(',')}. Must be one of: #{FLAG_MAP.keys.join(',')}"
  end
  flags.reduce(DEFAULT_FLAGS) do |sum, flag|
    sum |= (FLAG_MAP[flag] || 0)
  end
end