simple_regex 0.0.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 +7 -0
- data/lib/simple_regex.rb +155 -0
- data/lib/simple_regex/version.rb +3 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4cdb3c7de307a3117543bbe93423f34f4386206c
|
4
|
+
data.tar.gz: 5d01fde5da692cbae69d8385b02dfe76d4fe9b3b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1364a4dc2c303d1a1f7b258062e1d0ab504fa2d83fdb78de5a52d1ecf6805c377620d1f28500c64ea47161065f8aa12bdee243634db2183f213ccd22f730ac25
|
7
|
+
data.tar.gz: 5e82e7bc9f76de2cddf23e8338471f4d5b69083d75ea58a12e5082ed6493aaa2bd193f596665c8c25cd0d4d042f7f78b6833fb67784b256168afe8514ccb3c12
|
data/lib/simple_regex.rb
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
class SimpleRegex
|
2
|
+
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
PATTERNS = {
|
6
|
+
'digit' => '[0-9]',
|
7
|
+
'lowercase' => '[a-z]',
|
8
|
+
'uppercase' => '[A-Z]',
|
9
|
+
'letter' => '[A-Za-z]',
|
10
|
+
'alphanumeric' => '[A-Za-z0-9]',
|
11
|
+
'whitespace' => '\s',
|
12
|
+
'space' => ' ',
|
13
|
+
'tab' => '\t'
|
14
|
+
}
|
15
|
+
|
16
|
+
ESCAPED_CHARS = %w(
|
17
|
+
* . ? ^ + $ | ( ) [ ] { }
|
18
|
+
)
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@str = ''
|
22
|
+
@ended = false
|
23
|
+
end
|
24
|
+
|
25
|
+
def start_with(*args)
|
26
|
+
raise SimpleRegex::Error.new('#start_with? called multiple times') unless @str.empty?
|
27
|
+
write '^%s', args
|
28
|
+
end
|
29
|
+
|
30
|
+
def append(*args)
|
31
|
+
write interpret(*args)
|
32
|
+
end
|
33
|
+
alias_method :then, :append
|
34
|
+
|
35
|
+
def end_with(*args)
|
36
|
+
write '%s$', args
|
37
|
+
@ended = true
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def maybe(*args)
|
42
|
+
write '%s?', args
|
43
|
+
end
|
44
|
+
|
45
|
+
def not(*args)
|
46
|
+
write '(?!%s)', args
|
47
|
+
end
|
48
|
+
|
49
|
+
def one_of(ary)
|
50
|
+
write '[%s]' % ary.map { |c| escape(c) }.join('|')
|
51
|
+
end
|
52
|
+
|
53
|
+
def between(range, pattern)
|
54
|
+
unless range.length == 2 && range.any? { |i| i.is_a?(Integer) }
|
55
|
+
raise SimpleRegex:Error.new('must provide an array of 2 elements, one of them must be an integer')
|
56
|
+
end
|
57
|
+
|
58
|
+
write '%s{%s,%s}' % [interpret(pattern), range[0], range[1]]
|
59
|
+
end
|
60
|
+
|
61
|
+
def at_least(times, pattern)
|
62
|
+
between [times, nil], pattern
|
63
|
+
end
|
64
|
+
|
65
|
+
def at_most(times, pattern)
|
66
|
+
between [nil, times], pattern
|
67
|
+
end
|
68
|
+
|
69
|
+
def zero_or_more(pattern)
|
70
|
+
write '%s*', pattern
|
71
|
+
end
|
72
|
+
|
73
|
+
def one_or_more(pattern)
|
74
|
+
write '%s+', pattern
|
75
|
+
end
|
76
|
+
|
77
|
+
def regex
|
78
|
+
Regexp.new(@str)
|
79
|
+
end
|
80
|
+
alias_method :get, :regex
|
81
|
+
|
82
|
+
def =~(other)
|
83
|
+
regex =~ other
|
84
|
+
end
|
85
|
+
|
86
|
+
def method_missing(meth, *args, &block)
|
87
|
+
regex.send(meth, *args, &block)
|
88
|
+
end
|
89
|
+
|
90
|
+
def respond_to?(meth)
|
91
|
+
regex.respond_to?(meth) || super
|
92
|
+
end
|
93
|
+
|
94
|
+
def to_s
|
95
|
+
"#<SimpleRegex:#{object_id} regex=/#{@str}/>"
|
96
|
+
end
|
97
|
+
|
98
|
+
def inspect
|
99
|
+
to_s
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def write(str, args=nil)
|
105
|
+
raise SimpleRegex::Error.new('#end_with has already been called') if @ended
|
106
|
+
@str << (args.nil? ? str : str % interpret(*args))
|
107
|
+
self
|
108
|
+
end
|
109
|
+
|
110
|
+
# Translate/escape characters etc and return regex-ready string
|
111
|
+
def interpret(*args)
|
112
|
+
case args.length
|
113
|
+
when 2 then numbered_constraint(*args)
|
114
|
+
when 1 then patterned_constraint(*args)
|
115
|
+
else raise ArgumentError
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Ex: (2, 'x') or (3, :digits)
|
120
|
+
def numbered_constraint(count, type)
|
121
|
+
pattern = patterned_constraint(type)
|
122
|
+
raise SimpleRegex::Error.new('Unrecognized pattern') if pattern.nil? || pattern.empty?
|
123
|
+
'%s{%s}' % [pattern, count]
|
124
|
+
end
|
125
|
+
|
126
|
+
# Ex: ('aa') or ('$')
|
127
|
+
def patterned_constraint(pattern)
|
128
|
+
escape translate(pattern)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Remove a trailing 's', if there is one
|
132
|
+
def singularize(word)
|
133
|
+
str = word.to_s
|
134
|
+
str.end_with?('s') ? str[0..-2] : str
|
135
|
+
end
|
136
|
+
|
137
|
+
# Escape special regex characters in a string
|
138
|
+
#
|
139
|
+
# Ex:
|
140
|
+
# escape("one.two")
|
141
|
+
# # => "one\.two"
|
142
|
+
#
|
143
|
+
def escape(pattern)
|
144
|
+
pattern.to_s.gsub(/.+/) do |char|
|
145
|
+
ESCAPED_CHARS.include?(char) ? "\\#{char}" : char
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Translate an identifier such as :digits to [0-9], etc
|
150
|
+
# Returns the original identifier if no character class found
|
151
|
+
def translate(pattern)
|
152
|
+
PATTERNS[singularize(pattern)] || pattern
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_regex
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Berls
|
8
|
+
- Puru Dahal
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-09-13 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '3.6'
|
21
|
+
type: :development
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '3.6'
|
28
|
+
description: " SimpleRegex provides a flexible syntax for constructing regular expressions
|
29
|
+
by chaining Ruby method calls instead of deciphering cryptic syntax. "
|
30
|
+
email:
|
31
|
+
- andrew.berls@gmail.com
|
32
|
+
- puru@dahal.me
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- lib/simple_regex.rb
|
38
|
+
- lib/simple_regex/version.rb
|
39
|
+
homepage: https://github.com/superpowr/simple_regex
|
40
|
+
licenses:
|
41
|
+
- MIT
|
42
|
+
metadata: {}
|
43
|
+
post_install_message:
|
44
|
+
rdoc_options: []
|
45
|
+
require_paths:
|
46
|
+
- lib
|
47
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
requirements: []
|
58
|
+
rubyforge_project:
|
59
|
+
rubygems_version: 2.6.13
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: Simple Regular Expression
|
63
|
+
test_files: []
|