Module: RegexSample

Defined in:
lib/regex_sample.rb,
lib/regex_sample/version.rb

Constant Summary collapse

Numbers =
Array(0..9)
ULetters =
Array('A'..'Z')
Letters =
ULetters + Array('a'..'z')
Katakanas =
Array(''..'')
Hiraganas =
Array(''..'')
VERSION =
"0.1.1"

Class Method Summary collapse

Class Method Details

.generate(re) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/regex_sample.rb', line 13

def generate(re)
  times = Proc.new{ $1 * Array(Range.new($2.to_i, $3.to_i)).sample }

  re = re.source if re.respond_to?(:source) # Handle either a Regexp or a String that looks like a Regexp
  re
  .gsub(/\A\\A/, '')             # Remove \A
  .gsub(/\\z\z/, '')             # Remove \z
  .gsub(/^\/?\^?/, '')           # Ditch the anchors
  .gsub(/\$?\/?$/, '')           # Ditch the anchors
  .gsub(/\{(\d+)\}/, '{\1,\1}')  # {2} become {2,2}
  .gsub(/(?<!\\)\?/, '{0,1}')    # ? become {0,1}
  .gsub(/(?<!\\)\+/, '{1,2}')    # Remove +, except \+
  .gsub(/\\\?/, '?')             # \\? become ?
  .gsub(/\\\+/, '+')             # \\+ become +
  .gsub(/(\[[^\]]+\])\{(\d+),(\d+)\}/)      { times.call } # [12]{1,2} becomes [12] or [12][12]
  .gsub(/(\([^\)]+\))\{(\d+),(\d+)\}/)      { times.call } # (12|34){1,2} becomes (12|34) or .(12|34)(12|34)
  .gsub(/(\\p\{katakana\})\{(\d+),(\d+)\}/) { times.call } # \p{katakana}{1,2} becomes .\p{katakana} or \p{katakana}\p{katakana}
  .gsub(/(\\p\{hiragana\})\{(\d+),(\d+)\}/) { times.call } # \p{hiragana}{1,2} becomes .\p{hiragana} or \p{hiragana}\p{hiragana}
  .gsub(/(\\?.)\{(\d+),(\d+)\}/)            { times.call } # A{1,2} becomes A or AA or \d{3} becomes .\d\d\d
  .gsub(/\((.*?)\)/){ |match| match.gsub(/[\(\)]/, '').split('|').sample } # (this|that) becomes 'this' or 'that'
  .gsub(/\[([^\]]+)\]/) {|match| match.gsub(/(\w\-\w)/) {|range| Array(Range.new(*range.split('-'))).sample } }  # All A-Z inside of [] become C (or X, or .whatever)
  .gsub('\p{katakana}'){ Katakanas.sample }
  .gsub('\p{hiragana}'){ Hiraganas.sample }
  .gsub(/\[([^\]]+)\]/){ $1.split('').sample }  # All [ABC] become B (or A or C)
  .gsub('\d'){ Numbers.sample }
  .gsub('\w'){ Letters.sample }
end