Class: JavaRegex::Translator

Inherits:
Object
  • Object
show all
Defined in:
lib/java_regex/translator.rb

Class Method Summary collapse

Class Method Details

.character_classes_or_character_sets(regex) ⇒ Object



28
29
30
# File 'lib/java_regex/translator.rb', line 28

def self.character_classes_or_character_sets(regex)
  regex.gsub!(/(\[\\.)-(.\])/, '\1\\-\2')
end

.characters(regex) ⇒ Object

Raises:



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/java_regex/translator.rb', line 15

def self.characters(regex)
  meta_char_start = regex.scan('\Q')  
  meta_char_end = regex.scan('\E')  
  control_char = regex.scan(/\\c[[:upper:]]/)
  raise JavaRegexException::TranslationError,
    '"\Q" and "\E" are not supported' unless
      meta_char_start.empty? and 
      meta_char_end.empty?
  raise JavaRegexException::TranslationError,
    '"\ccA" through "\ccZ" are not supported' unless
      control_char.empty?
end

.modifiers(regex) ⇒ Object

Raises:



39
40
41
42
43
44
# File 'lib/java_regex/translator.rb', line 39

def self.modifiers(regex)
  newline = regex.scan(/\\n/)
  raise JavaRegexException::TranslationError,
    'Newlines are currently not supported' unless
      newline.empty?
end

.posix_bracket_expressions!(regex) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/java_regex/translator.rb', line 51

def self.posix_bracket_expressions!(regex)
  regex.gsub!('\p{Lower}', '[[:lower:]]')
  regex.gsub!('\p{Upper}', '[[:upper:]]')
  regex.gsub!('\p{Alpha}', '[[:alpha:]]')
  regex.gsub!('\p{Digit}', '[[:digit:]]')
  regex.gsub!('\p{Alnum}', '[[:alnum:]]')
  regex.gsub!('\p{Punct}', '[[:punct:]]')
  regex.gsub!('\p{Graph}', '[[:graph:]]')
  regex.gsub!('\p{Print}', '[[:print:]]')
  regex.gsub!('\p{Blank}', '[[:blank:]]')
  regex.gsub!('\p{Cntrl}', '[[:cntrl:]]')
  regex.gsub!('\p{Space}', '[[:space:]]')
  regex.gsub!('\p{XDigit}', '[[:xdigit:]]')
  regex.gsub!('\p{ASCII}', '[[:print:][:cntrl:]]')
end

.translate(regex) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
# File 'lib/java_regex/translator.rb', line 3

def self.translate(regex)
  regex = String.new(regex)
  characters(regex)
  character_classes_or_character_sets(regex)
  word_boundaries(regex)
  modifiers(regex)
  unicode_characters!(regex)
  posix_bracket_expressions!(regex)
  regex.sub!(/\A(.*)\z/, '\A\1\z')
  return regex
end

.unicode_characters!(regex) ⇒ Object



46
47
48
49
# File 'lib/java_regex/translator.rb', line 46

def self.unicode_characters!(regex)
  re = /\\u([[:xdigit:]]{4})/
  regex.gsub!(re) { |m| m.gsub!(/\A.*\z/, [Integer("0x#{$1}")].pack('U*')) }
end

.word_boundaries(regex) ⇒ Object

Raises:



32
33
34
35
36
37
# File 'lib/java_regex/translator.rb', line 32

def self.word_boundaries(regex)
  non_ascii = regex.scan(/\\[bB][[:print:][:cntrl:]]/)
  raise JavaRegexException::TranslationError,
    'Non-ascii characters following "\b" or "\B" are not supported' unless
      non_ascii.empty?
end