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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de6185e754f2be3fdc0cf5f9f24a67c0a6289464
4
- data.tar.gz: 490f40661f5b4c6f3c0e5a7de76e8281dfe1527a
3
+ metadata.gz: c605c242810018d440dc6d1d875afc58d5a2d96c
4
+ data.tar.gz: 3953bc522d7d19a6841e8b9cace5b6c1a28a19ab
5
5
  SHA512:
6
- metadata.gz: 3511e274dd0c0c4772dc5197b45fba13f768fff23a488e052c80d20e6d156261f68cdaaebf65ecb14661fbcb001b8c717c0087c8171df9d3d99d8dac332e861b
7
- data.tar.gz: 8f31d298e7a35adc232bd7ff5c89eee6a223a77c5287ba7c5d5980c5b5b3c35e908f6f726ad57042decb0d926d2234039b0ac09b28d79c2782c4880b0dce682a
6
+ metadata.gz: 1d6b675099dba297d50987883b8a707422faac872f20d5d3ce2e96cc9e4be707a4397632e0405353643589a67f8a534660619aea9a35358728acaeb09bf2d109
7
+ data.tar.gz: 0edac468491065e62d1133806af2f8869e16c179e193c8a06afd4dde4c6b263bd1ec6343a314fc38341d8aedbb6ae73db441c966103bac7e551a80bad9b366f4
@@ -1,5 +1,56 @@
1
- require "regex_for_range/version"
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
- # Your code goes here...
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
@@ -1,3 +1,3 @@
1
1
  module RegexForRange
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -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.0
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