RegExpr 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/AUTHORS +1 -0
  2. data/VERSION +1 -1
  3. data/lib/regexpr.rb +65 -32
  4. metadata +24 -39
data/AUTHORS ADDED
@@ -0,0 +1 @@
1
+ Denis Knauf <denis dot knauf at gmail dot com>
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -2,6 +2,7 @@
2
2
  class RegExpr< Hash
3
3
  end
4
4
 
5
+ # any thing
5
6
  class RegExpr::Segment
6
7
  attr_accessor :value
7
8
  def initialize( val) self.value= val end
@@ -22,12 +23,14 @@ class RegExpr::Segment
22
23
  v
23
24
  end
24
25
 
26
+ # can't have any segment as value
25
27
  def deepest
26
28
  self.class_eval do
27
29
  def names() [] end
28
30
  end
29
31
  end
30
32
 
33
+ # can't have any value
31
34
  def novalue
32
35
  self.class_eval do
33
36
  def initialize() end
@@ -45,6 +48,7 @@ class RegExpr::Segment
45
48
  end
46
49
  end
47
50
 
51
+ # /(VALUE)/ or /(?:VALUE)/
48
52
  class RegExpr::Block< RegExpr::Segment
49
53
  attr_accessor :name, :hidden
50
54
  def hidden?() @hidden end
@@ -54,6 +58,10 @@ class RegExpr::Block< RegExpr::Segment
54
58
  def empty?() @value.empty? end
55
59
  def size() @value.size end
56
60
 
61
+ def inspect
62
+ "#<#{self.class.name}: (#{hidden? ? '?:' : ''} #{value.map(&:inspect).join ' '} )>"
63
+ end
64
+
57
65
  def names
58
66
  names= @value.collect &:names
59
67
  names.push( name) unless self.hidden?
@@ -76,9 +84,11 @@ class RegExpr::Block< RegExpr::Segment
76
84
  else list[ -1].push v
77
85
  end
78
86
  end
87
+ #return self
79
88
 
89
+ # [A,C,A,C,Cs,As,C,Cs,C] => [A,A,As], chars = [C,C|Cs]++[C|Cs]++[C]
80
90
  list.delete_if do |v|
81
- if (RegExpr::Chars === v[ 0] and v.size == 1 ) or RegExpr::Char === v[ 0]
91
+ if (1 == v.size and RegExpr::Chars === v[ 0]) or RegExpr::Char === v[ 0]
82
92
  chars+= v[ 0]
83
93
  else false
84
94
  end
@@ -100,7 +110,7 @@ class RegExpr::Block< RegExpr::Segment
100
110
  u ? w : w.value
101
111
  else w
102
112
  end
103
- end.flatten
113
+ end.flatten.compact
104
114
  end
105
115
  end
106
116
  values.push RegExpr::Or.new, chars if chars.size > 0
@@ -114,6 +124,7 @@ class RegExpr::Block< RegExpr::Segment
114
124
  end
115
125
  end
116
126
 
127
+ # /(?!VALUE)/
117
128
  class RegExpr::Not< RegExpr::Segment
118
129
  deepest
119
130
  novalue
@@ -126,6 +137,7 @@ class RegExpr::Not< RegExpr::Segment
126
137
  end
127
138
  end
128
139
 
140
+ # eg: 1..99 => /[1-9]|[1-9][1-9]/
129
141
  class RegExpr::Range< RegExpr::Segment
130
142
  novalue
131
143
  attr_accessor :v1, :v2
@@ -143,9 +155,9 @@ class RegExpr::Range< RegExpr::Segment
143
155
  bf= b == 0 ? 1.0 : b.to_f
144
156
  1.upto( b.to_s.length- 1) do |i|
145
157
  pot= 10** i
146
- num= (af/ pot).ceil* pot # next higher number with i zeros
158
+ num= (af/ pot).ceil * pot # next higher number with i zeros
147
159
  arr.insert i, num if num < @v2
148
- num= (bf/ pot).floor* pot # next lower number with i zeros
160
+ num= (bf/ pot).floor * pot # next lower number with i zeros
149
161
  arr.insert -i, num
150
162
  end
151
163
  arr.uniq!
@@ -153,15 +165,13 @@ class RegExpr::Range< RegExpr::Segment
153
165
 
154
166
  result= RegExpr::Block.new
155
167
  0.upto( arr. length- 2) do |i|
156
- first= arr[ i].to_s
157
- second= (arr[ i+ 1]- 1).to_s
168
+ first, second= arr[ i].to_s, (arr[ i+ 1]- 1).to_s
158
169
  result.push RegExpr::Or.new
159
170
  0.upto( first.length- 1) do |j|
160
- result.push( if first[ j] == second[ j]
161
- RegExpr::Char.new first[ j].chr
162
- else
163
- RegExpr::Chars.new '%c-%c'% [ first[ j], second[ j] ]
164
- end)
171
+ fst, sec= first[ j], second[ j]
172
+ result.push fst == sec ?
173
+ RegExpr::Char.new( fst.chr) :
174
+ RegExpr::Chars.new( '%c-%c'% [ fst, sec ])
165
175
  end
166
176
  end
167
177
  result. value. shift
@@ -169,6 +179,7 @@ class RegExpr::Range< RegExpr::Segment
169
179
  end
170
180
  end
171
181
 
182
+ # /[CHARS]/ or /[^CHARS]/
172
183
  class RegExpr::Chars< RegExpr::Segment
173
184
  deepest
174
185
  attr_reader :chars, :not
@@ -181,6 +192,10 @@ class RegExpr::Chars< RegExpr::Segment
181
192
  def not!() @not= !@not end
182
193
  alias -@ not!
183
194
 
195
+ def inspect
196
+ "#<#{self.class.name}: [#{value}]>"
197
+ end
198
+
184
199
  def split
185
200
  chars= []
186
201
  @chars. gsub( /\\-/) do |r|
@@ -241,7 +256,9 @@ class RegExpr::Chars< RegExpr::Segment
241
256
  end
242
257
  end
243
258
 
259
+ # /VALUE{MIN,MAX}/
244
260
  class RegExpr::Repeat< RegExpr::Segment
261
+ SimpleChar= Hash[ *%w<{,1} ? {0,1} ? {0,} * {,} * {1,} +> + ['{1,1}', ''] ]
245
262
  attr_reader :min, :max
246
263
 
247
264
  def minandmax x
@@ -265,8 +282,7 @@ class RegExpr::Repeat< RegExpr::Segment
265
282
  def to_r
266
283
  t= '{%s,%s}'% [ @min||'', @max||'' ]
267
284
  return '' if '{0,0}' == t
268
- t= Hash[ *%w<{,1} ? {0,1} ? {0,} * {,} * {1,} +>+ ['{1,1}', ''] ][ t]|| t
269
- @value.to_r+ t
285
+ @value.to_r+ (SimpleChar[ t] || t)
270
286
  end
271
287
  end
272
288
 
@@ -343,15 +359,16 @@ class RegExpr
343
359
  end
344
360
  end
345
361
 
346
- def to_r exp= :main
347
- r = self.to_re( exp)
348
- #r.optimize!
362
+ def to_r exp= nil
363
+ r = self.to_re exp
364
+ r.optimize!
349
365
  h, r = r.hidden?, r.to_r
350
366
  r = r[ 1...-1] unless h
351
367
  ::Regexp.new r
352
368
  end
353
369
 
354
- def to_re exp= :main
370
+ def to_re exp= nil
371
+ exp||= :main
355
372
  u= RegExpr::Block.new
356
373
  t, u.hidden= if Symbol === exp
357
374
  u.name= exp.to_sym
@@ -361,7 +378,11 @@ class RegExpr
361
378
  end
362
379
  else [ exp.to_s, true]
363
380
  end
381
+ parse t
382
+ end
364
383
 
384
+ def parse t, u= nil
385
+ u||= RegExpr::Block.new
365
386
  until !t or t.empty?
366
387
  v, t= self.to_r_next t
367
388
  case v
@@ -394,7 +415,8 @@ class RegExpr
394
415
  i= exp[ 2.. -1].to_i h
395
416
  return RegExpr::Char.new( i.chr), exp[ (i.to_s( h). size+ 2).. -1]
396
417
 
397
- when ?. then return RegExpr::WildCard.new( '.'), exp[ 1.. -1]
418
+ when ?.
419
+ return RegExpr::WildCard.new( '.'), exp[ 1.. -1]
398
420
 
399
421
  when ?0
400
422
  case exp[ 1]
@@ -406,13 +428,17 @@ class RegExpr
406
428
  return '', $1.to_i( 2).to_s+ $'
407
429
  else
408
430
  case exp
409
- when %r<(\d+)..(\d+)> then RegExpr::Range.new $1.to_i, $2.to_i
410
- when %r<^(\d+,\d+|,\d+|\d+,?)> then RegExpr::Repeat.new '', *$1.split( ',')
411
- else raise ArgumentError, 'Unknown form "%s"'% exp
431
+ when %r<(\d+)..(\d+)>
432
+ RegExpr::Range.new $1.to_i, $2.to_i
433
+ when %r<^(\d+,\d+|,\d+|\d+,?)>
434
+ RegExpr::Repeat.new '', *$1.split( ',')
435
+ else
436
+ raise ArgumentError, 'Unknown form "%s"'% exp
412
437
  end
413
438
  end
414
439
 
415
- when ?( then return self.to_re( exp[ 1.. -1])
440
+ when ?(
441
+ return parse( exp[ 1.. -1])
416
442
  when ?) then ')'
417
443
  when ?| then RegExpr::Or.new
418
444
 
@@ -420,19 +446,26 @@ class RegExpr
420
446
  when ?* then RegExpr::Repeat.new '', nil
421
447
  when ?? then RegExpr::Repeat.new '', 0, 1
422
448
 
423
- when ?" then RegExpr::Char.new %r<^"((?:[^"]|\\")*)">.match( exp)[ 1]
424
- when ?[ then RegExpr::Chars.new %r<^\[((?:[^\]]|\\\])*[^\\]|)\]>.match( exp)[ 1]
425
- when ?/ then exp =~ %r<^/((?:[^/]|\\/)*)/(im?|mi)?>
426
- RegExpr::Regexp.new ::Regexp.new( $1,
427
- ($2 =~ /i/ ? ::Regexp::IGNORECASE : 0)+
428
- ($2 =~ /m/ ? ::Regexp::MULTILINE : 0))
449
+ when ?"
450
+ RegExpr::Char.new %r<^"((?:[^"]|\\")*)">.match( exp)[ 1]
451
+ when ?[
452
+ RegExpr::Chars.new %r<^\[((?:[^\]]|\\\])*[^\\]|)\]>.match( exp)[ 1]
453
+ when ?/
454
+ _, re, f= %r<^/((?:[^/]|\\/)*)/(im?|mi)?>.match( exp)
455
+ flg= $2=~ /i/ ? ::Regexp::IGNORECASE : 0
456
+ flg+= $2=~ /m/ ? ::Regexp::MULTILINE : 0
457
+ RegExpr::Regexp.new ::Regexp.new( re, flg)
429
458
 
430
459
  else
431
460
  case exp
432
- when %r<^([a-z_][a-z_0-9]*\b)>i then self.to_re $1.to_sym
433
- when %r<(\d+)..(\d+)> then RegExpr::Range.new $1.to_i, $2.to_i
434
- when %r<^(\d+,\d+|,\d+|\d+,?)> then RegExpr::Repeat.new '', *$1.split( ',')
435
- else raise ArgumentError, 'Unknown form "%s"'% exp
461
+ when %r<^([a-z_][a-z_0-9]*\b)>i
462
+ self.to_re $1.to_sym
463
+ when %r<(\d+)..(\d+)>
464
+ RegExpr::Range.new $1.to_i, $2.to_i
465
+ when %r<^(\d+,\d+|,\d+|\d+,?)>
466
+ RegExpr::Repeat.new '', *$1.split( ',')
467
+ else
468
+ raise ArgumentError, 'Unknown form "%s"'% exp
436
469
  end
437
470
  end
438
471
  [ t, $' ]
metadata CHANGED
@@ -1,65 +1,50 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: RegExpr
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - Denis Knauf
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2010-03-19 00:00:00 +01:00
18
- default_executable:
12
+ date: 2012-12-09 00:00:00.000000000 Z
19
13
  dependencies: []
20
-
21
14
  description: Write Regular Expressions in a Hash and generats an optimized Regex
22
15
  email: Denis.Knauf@gmail.com
23
16
  executables: []
24
-
25
17
  extensions: []
26
-
27
- extra_rdoc_files:
18
+ extra_rdoc_files:
28
19
  - LICENSE
29
- files:
20
+ files:
21
+ - AUTHORS
30
22
  - VERSION
31
23
  - lib/regexpr-uri.rb
32
24
  - lib/regexpr.rb
33
25
  - LICENSE
34
- has_rdoc: true
35
26
  homepage: http://github.com/DenisKnauf/RegExpr
36
27
  licenses: []
37
-
38
28
  post_install_message:
39
- rdoc_options:
40
- - --charset=UTF-8
41
- require_paths:
29
+ rdoc_options: []
30
+ require_paths:
42
31
  - lib
43
- required_ruby_version: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- segments:
48
- - 0
49
- version: "0"
50
- required_rubygems_version: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- version: "0"
32
+ required_ruby_version: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
57
44
  requirements: []
58
-
59
45
  rubyforge_project:
60
- rubygems_version: 1.3.6
46
+ rubygems_version: 1.8.23
61
47
  signing_key:
62
48
  specification_version: 3
63
49
  summary: Regular Expression Creator
64
50
  test_files: []
65
-