regex_for_range 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/lib/regex_for_range.rb +53 -2
- data/lib/regex_for_range/range.rb +33 -0
- data/lib/regex_for_range/util.rb +55 -0
- data/lib/regex_for_range/version.rb +1 -1
- data/regex_for_range.gemspec +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c605c242810018d440dc6d1d875afc58d5a2d96c
|
4
|
+
data.tar.gz: 3953bc522d7d19a6841e8b9cace5b6c1a28a19ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d6b675099dba297d50987883b8a707422faac872f20d5d3ce2e96cc9e4be707a4397632e0405353643589a67f8a534660619aea9a35358728acaeb09bf2d109
|
7
|
+
data.tar.gz: 0edac468491065e62d1133806af2f8869e16c179e193c8a06afd4dde4c6b263bd1ec6343a314fc38341d8aedbb6ae73db441c966103bac7e551a80bad9b366f4
|
data/lib/regex_for_range.rb
CHANGED
@@ -1,5 +1,56 @@
|
|
1
|
-
require
|
1
|
+
require 'regex_for_range/version'
|
2
|
+
require 'regex_for_range/util'
|
3
|
+
require 'regex_for_range/range'
|
2
4
|
|
3
5
|
module RegexForRange
|
4
|
-
|
6
|
+
class << self
|
7
|
+
|
8
|
+
def get_regex_for_range(first, last)
|
9
|
+
left = left_bounds(first, last)
|
10
|
+
last_left = left.delete_at(left.length - 1)
|
11
|
+
|
12
|
+
right = right_bounds(last_left.first, last)
|
13
|
+
first_right = right.delete_at(0)
|
14
|
+
|
15
|
+
merged = []
|
16
|
+
merged += left
|
17
|
+
|
18
|
+
if !last_left.overlaps(first_right)
|
19
|
+
merged.push(last_left)
|
20
|
+
merged.push(first_right)
|
21
|
+
else
|
22
|
+
merged.push(RegexForRange::Util.join(last_left, first_right))
|
23
|
+
end
|
24
|
+
|
25
|
+
merged += right
|
26
|
+
|
27
|
+
return RegexForRange::Util.join_regex_by_or(merged)
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def left_bounds(first, last)
|
32
|
+
|
33
|
+
results = []
|
34
|
+
|
35
|
+
while last > first
|
36
|
+
range = RegexForRange::Util.from_start(first)
|
37
|
+
results.push(range)
|
38
|
+
first = range.last + 1
|
39
|
+
end
|
40
|
+
|
41
|
+
return results
|
42
|
+
end
|
43
|
+
|
44
|
+
def right_bounds(first, last)
|
45
|
+
results = []
|
46
|
+
|
47
|
+
while last > first
|
48
|
+
range = RegexForRange::Util.from_end(last)
|
49
|
+
results.push(range)
|
50
|
+
last = range.first - 1
|
51
|
+
end
|
52
|
+
|
53
|
+
return results.reverse
|
54
|
+
end
|
55
|
+
end
|
5
56
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module RegexForRange
|
2
|
+
class Range
|
3
|
+
attr_accessor :first
|
4
|
+
attr_accessor :last
|
5
|
+
|
6
|
+
def initialize(first, last)
|
7
|
+
@first = first
|
8
|
+
@last = last
|
9
|
+
end
|
10
|
+
|
11
|
+
def overlaps(range)
|
12
|
+
return self.last > range.first && range.last > self.first
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_regex
|
16
|
+
result = ''
|
17
|
+
|
18
|
+
first_str = self.first.to_s
|
19
|
+
last_str = self.last.to_s
|
20
|
+
|
21
|
+
for i in (0..first_str.length - 1)
|
22
|
+
if first_str[i] == last_str[i]
|
23
|
+
result += first_str[i]
|
24
|
+
else
|
25
|
+
result += '[' + first_str[i] + '-' + last_str[i] + ']'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
return result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module RegexForRange
|
2
|
+
module Util
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def from_end(last)
|
6
|
+
|
7
|
+
last_str = last.to_s
|
8
|
+
|
9
|
+
i = last_str.length - 1
|
10
|
+
|
11
|
+
while i >= 0 do
|
12
|
+
if last_str[i] == '9'
|
13
|
+
last_str[i] = '0'
|
14
|
+
else
|
15
|
+
last_str[i] = '0'
|
16
|
+
break
|
17
|
+
end
|
18
|
+
i -= 1
|
19
|
+
end
|
20
|
+
|
21
|
+
return Range.new(last_str.to_i, last)
|
22
|
+
end
|
23
|
+
|
24
|
+
def from_start(first)
|
25
|
+
first_str = first.to_s
|
26
|
+
|
27
|
+
i = first_str.length - 1
|
28
|
+
|
29
|
+
while i >= 0 do
|
30
|
+
if first_str[i] == '0'
|
31
|
+
first_str[i] = '9'
|
32
|
+
else
|
33
|
+
first_str[i] = '9'
|
34
|
+
break
|
35
|
+
end
|
36
|
+
i -= 1
|
37
|
+
end
|
38
|
+
|
39
|
+
return Range.new(first, first_str.to_i)
|
40
|
+
end
|
41
|
+
|
42
|
+
def join(range1, range2)
|
43
|
+
return Range.new(range1.first, range2.last)
|
44
|
+
end
|
45
|
+
|
46
|
+
def join_regex_by_or(ranges)
|
47
|
+
results = ''
|
48
|
+
ranges.each do |range|
|
49
|
+
results += range.to_regex + '|'
|
50
|
+
end
|
51
|
+
|
52
|
+
return results[0..-2]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/regex_for_range.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.description = 'Simple gem to get all regex given integer range'
|
14
14
|
spec.homepage = 'http://rubygems.org/gems/regex_for_range'
|
15
15
|
spec.license = 'MIT'
|
16
|
-
|
16
|
+
|
17
17
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
18
|
spec.bindir = "exe"
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: regex_for_range
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dhwanit Gupta
|
@@ -71,6 +71,8 @@ files:
|
|
71
71
|
- bin/console
|
72
72
|
- bin/setup
|
73
73
|
- lib/regex_for_range.rb
|
74
|
+
- lib/regex_for_range/range.rb
|
75
|
+
- lib/regex_for_range/util.rb
|
74
76
|
- lib/regex_for_range/version.rb
|
75
77
|
- regex_for_range.gemspec
|
76
78
|
homepage: http://rubygems.org/gems/regex_for_range
|