RegExpr 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
-