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.
- 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
|
-
|