RegExpr 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +1 -0
- data/VERSION +1 -1
- data/lib/regexpr.rb +65 -32
- 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
|
+
0.0.2
|
data/lib/regexpr.rb
CHANGED
@@ -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]
|
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
|
-
|
161
|
-
|
162
|
-
|
163
|
-
RegExpr::Chars.new '%c-%c'% [
|
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
|
-
|
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=
|
347
|
-
r = self.to_re
|
348
|
-
|
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=
|
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 ?.
|
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+)>
|
410
|
-
|
411
|
-
|
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 ?(
|
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 ?"
|
424
|
-
|
425
|
-
when
|
426
|
-
RegExpr::
|
427
|
-
|
428
|
-
|
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
|
433
|
-
|
434
|
-
when %r
|
435
|
-
|
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
|
-
|
5
|
-
|
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
|
-
|
41
|
-
require_paths:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
42
31
|
- lib
|
43
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
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.
|
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
|
-
|