regexy 0.0.3 → 0.0.4
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/README.md +52 -3
- data/lib/regexy.rb +3 -2
- data/lib/regexy/regexp.rb +34 -0
- data/lib/regexy/text.rb +6 -0
- data/lib/regexy/text/emoji.rb +13 -0
- data/lib/regexy/text/smile.rb +11 -0
- data/lib/regexy/version.rb +1 -1
- data/lib/regexy/web.rb +6 -5
- data/lib/regexy/web/email.rb +3 -3
- data/lib/regexy/web/hashtag.rb +1 -1
- data/lib/regexy/web/host_name.rb +13 -0
- data/lib/regexy/web/ip.rb +3 -3
- data/lib/regexy/web/url.rb +2 -2
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 740a4e8636dc31c08edce639aebe64da44275883
|
|
4
|
+
data.tar.gz: 0385b4f2e8873f0bc9e5e926c5e8c023df03b945
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2277af27c4c61f1d451941314f157e2a21a629bb73ffd73756f4b7169ac2d5c0b004a054c1c80ca47f05b66de43943f4692b702b394b8e267967261ae767efa0
|
|
7
|
+
data.tar.gz: 89bc96b9096413f9fcc01e513bb2659c1c76724070d0b585d9fedd03922d0f1469b0e9a8ab691ced575313bb9615790576580dabb7eda652edd3228005846f02
|
data/README.md
CHANGED
|
@@ -12,11 +12,16 @@ Regexy is the ruby gem that contains a lot of common-use regular expressions (su
|
|
|
12
12
|
- [Installation](#installation)
|
|
13
13
|
- [Usage](#usage)
|
|
14
14
|
* [General usage](#regexyregexp)
|
|
15
|
+
* [Getting the original regexp](#getting-the-original-regexp)
|
|
15
16
|
* [Combining expressions](#combining-regular-expressions)
|
|
17
|
+
* [Bound and unbound regex](#bound-and-unbound-regular-expressions)
|
|
16
18
|
* [Email addresses](#regexywebemail)
|
|
17
19
|
* [Hashtag](#regexywebhashtag)
|
|
18
20
|
* [IP addresses](#regexywebipv4)
|
|
19
21
|
* [Url](#regexyweburl)
|
|
22
|
+
* [Hostname](#regexywebhostname)
|
|
23
|
+
* [Smiles](#regexytextsmile)
|
|
24
|
+
* [Emojis](#regexytextemoji)
|
|
20
25
|
- [Contributing](#contributing)
|
|
21
26
|
|
|
22
27
|
## Installation
|
|
@@ -49,6 +54,13 @@ r4 = Regexy::Regexp.new('foo', Regexp::IGNORECASE) # pass additional configurati
|
|
|
49
54
|
'abcfoocde' =~ r1 # => 3
|
|
50
55
|
r2.match 'abcfoocde' # => #<MatchData "foo">
|
|
51
56
|
```
|
|
57
|
+
### Getting the original regexp
|
|
58
|
+
For methods, that checks if it's arguments `is_a` Regexp instances (for example `String#scan`) you can use `internal_regexp` method.
|
|
59
|
+
```ruby
|
|
60
|
+
str = 'Email me at first@mail.com or second@mail.com'
|
|
61
|
+
str.scan(Regexy::Web::Email.new.unbound.internal_regexp).map(&:first) # => ["first@mail.com", "second@mail.com"]
|
|
62
|
+
```
|
|
63
|
+
|
|
52
64
|
### Combining regular expressions
|
|
53
65
|
|
|
54
66
|
You can combine your regular expressions with `|` operator using `|` method (or `or`, which is alias for it). Note, that regexp options will be combined too.
|
|
@@ -61,11 +73,21 @@ any_ipv4 = Regexy::Web::IPv4.new(:normal) | Regexy::Web::IPv4.new(:with_port) #
|
|
|
61
73
|
Also you could simply join two expressions using `+` method, or it's alias `and_then`. Note, that it will __remove__ trailing `\z` from first regex and leading `\A` from second regex.
|
|
62
74
|
```ruby
|
|
63
75
|
Regexy::Regexp.new('foo') + Regexy::Regexp.new(/bar/) # => /foobar/
|
|
64
|
-
Regexy::Regexp.new(/foo\z/i)
|
|
65
|
-
Regexy::Regexp.new(/foo/).
|
|
66
|
-
Regexy::Regexp.new(/\Afoo\z/).
|
|
76
|
+
Regexy::Regexp.new(/foo\z/i) + /bar/ # => /foobar/i
|
|
77
|
+
Regexy::Regexp.new(/foo/).and_then '\Abar' # => /foobar/
|
|
78
|
+
Regexy::Regexp.new(/\Afoo\z/).and_then '\Abar\z' # => /\Afoobar\z/
|
|
67
79
|
```
|
|
80
|
+
### Bound and unbound regular expressions
|
|
81
|
+
All build-in regular expressions provided in a form of `\A...\z`, which means that they match entire string only. You can remove or add string boundaries using `bound` and `unbound` methods.
|
|
82
|
+
Optional argument `method` available (`:both` by default) - `:left` for manipulating only leading `\A` and `:right` for trailing `\z`.
|
|
83
|
+
```ruby
|
|
84
|
+
Regexy::Regexp.new('/Afoo/z').unbound(:left) # => /foo\z/
|
|
85
|
+
Regexy::Regexp.new(/foo/i).bound # => /\Afoo\z/i
|
|
68
86
|
|
|
87
|
+
# Example - find all ip addresses in the string
|
|
88
|
+
str = '0.0.0.0 and 255.255.255.255 are both valid ip addresses'
|
|
89
|
+
str.scan(Regexy::Web::IPv4.new.unbound.internal_regexp).flatten # => ["0.0.0.0", "255.255.255.255"]
|
|
90
|
+
```
|
|
69
91
|
### Regexy::Web::Email
|
|
70
92
|
|
|
71
93
|
Generates regular expressions for email addresses validation (with unicode support). Available options: `:relaxed` for general sanity check, `:normal` (which is default) with some additional length and ip addresses validations and `:strict` for the paranoids.
|
|
@@ -110,5 +132,32 @@ Generates regular expressions for matching Url addresses (with unicode support).
|
|
|
110
132
|
r1 = Regexy::Web::Url.new # matches 'http://foo.com', 'www.foo.com' and 'foo.com'
|
|
111
133
|
```
|
|
112
134
|
|
|
135
|
+
### Regexy::Web::HostName
|
|
136
|
+
|
|
137
|
+
Generates regular expressions for matching hostname (with unicode support).
|
|
138
|
+
|
|
139
|
+
```ruby
|
|
140
|
+
r1 = Regexy::Web::HostName.new # matches 'foo.com', 'www.foo.com' and 'киррилический.домен.рф'
|
|
141
|
+
```
|
|
142
|
+
### Regexy::Text::Smile
|
|
143
|
+
|
|
144
|
+
Generates regular expressions for matching smiles.
|
|
145
|
+
```ruby
|
|
146
|
+
r = Regexy::Text::Smile.new # matches ':)', ':=)', 'xD' and so on
|
|
147
|
+
# Find all smiles in text
|
|
148
|
+
str = "Check out http://foo.com :). It's awesome :D"
|
|
149
|
+
str.scan(r.unbound.internal_regexp).map(&:first) # => [":)", ":D"]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Regexy::Text::Emoji
|
|
153
|
+
|
|
154
|
+
Generates regular expressions for matching emojis.
|
|
155
|
+
```ruby
|
|
156
|
+
r = Regexy::Text::Emoji.new # matches '😀','😄' and so on
|
|
157
|
+
# Replace all emojis with 'x_x'
|
|
158
|
+
str = "Check out http://foo.com 😀. It's awesome 😼"
|
|
159
|
+
str.gsub(r.internal_regexp, 'x_x') # => "Check out http://foo.com x_x. It's awesome x_x"
|
|
160
|
+
```
|
|
161
|
+
|
|
113
162
|
## Contributing
|
|
114
163
|
Have an idea of new regular expression? Create an [issue](https://github.com/vladimir-tikhonov/regexy/issues) (some test cases will be much appreciated) or open a [pull request](https://github.com/vladimir-tikhonov/regexy/pulls).
|
data/lib/regexy.rb
CHANGED
data/lib/regexy/regexp.rb
CHANGED
|
@@ -32,6 +32,32 @@ module Regexy
|
|
|
32
32
|
|
|
33
33
|
alias_method :and_then, :+
|
|
34
34
|
|
|
35
|
+
def bound(method = :both)
|
|
36
|
+
new_regexp = source
|
|
37
|
+
method = method.to_sym
|
|
38
|
+
if method == :left || method == :both
|
|
39
|
+
new_regexp.prepend('\A')
|
|
40
|
+
end
|
|
41
|
+
if method == :right || method == :both
|
|
42
|
+
new_regexp.concat('\z')
|
|
43
|
+
end
|
|
44
|
+
new_regexp = additional_bound(method, new_regexp)
|
|
45
|
+
::Regexy::Regexp.new(new_regexp, options)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def unbound(method = :both)
|
|
49
|
+
new_regexp = source
|
|
50
|
+
method = method.to_sym
|
|
51
|
+
if method == :left || method == :both
|
|
52
|
+
new_regexp.sub!(/\A\\A/, '')
|
|
53
|
+
end
|
|
54
|
+
if method == :right || method == :both
|
|
55
|
+
new_regexp.sub!(/\\z\s*\z/, '')
|
|
56
|
+
end
|
|
57
|
+
new_regexp = additional_unbound(method, new_regexp)
|
|
58
|
+
::Regexy::Regexp.new(new_regexp, options)
|
|
59
|
+
end
|
|
60
|
+
|
|
35
61
|
protected
|
|
36
62
|
|
|
37
63
|
def normalize_regexp(regexp, *args)
|
|
@@ -41,6 +67,14 @@ module Regexy
|
|
|
41
67
|
else regexp
|
|
42
68
|
end
|
|
43
69
|
end
|
|
70
|
+
|
|
71
|
+
def additional_bound(method, regex) # You can override this methods if your regular expression needs additional bound/unbound logic
|
|
72
|
+
regex
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def additional_unbound(method, regex)
|
|
76
|
+
regex
|
|
77
|
+
end
|
|
44
78
|
end
|
|
45
79
|
|
|
46
80
|
class RegexpWithMode < ::Regexy::Regexp
|
data/lib/regexy/text.rb
ADDED
data/lib/regexy/version.rb
CHANGED
data/lib/regexy/web.rb
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
module Regexy
|
|
2
2
|
module Web
|
|
3
|
-
autoload :Email,
|
|
4
|
-
autoload :Hashtag,
|
|
5
|
-
autoload :IPv4,
|
|
6
|
-
autoload :IPv6,
|
|
7
|
-
autoload :Url,
|
|
3
|
+
autoload :Email, 'regexy/web/email'
|
|
4
|
+
autoload :Hashtag, 'regexy/web/hashtag'
|
|
5
|
+
autoload :IPv4, 'regexy/web/ip'
|
|
6
|
+
autoload :IPv6, 'regexy/web/ip'
|
|
7
|
+
autoload :Url, 'regexy/web/url'
|
|
8
|
+
autoload :HostName, 'regexy/web/host_name'
|
|
8
9
|
end
|
|
9
10
|
end
|
data/lib/regexy/web/email.rb
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
module Regexy
|
|
4
4
|
module Web
|
|
5
5
|
class Email < ::Regexy::RegexpWithMode
|
|
6
|
-
EMAIL_RELAXED = /\A\s*[^@\s]
|
|
7
|
-
EMAIL_NORMAL = /\A\s*([^@\s]{1,64})@((?:[-\p{L}\d]+\.)+\p{L}{2,})\s*\z/i.freeze
|
|
8
|
-
EMAIL_STRICT = /\A\s*([-\p{L}\d+._]{1,64})@((?:[-\p{L}\d]+\.)+\p{L}{2,})\s*\z/i.freeze
|
|
6
|
+
EMAIL_RELAXED = /\A\s*(([^@\s]+)@(([^@\s]+\.)+[^@\s]+))\s*\z/i.freeze
|
|
7
|
+
EMAIL_NORMAL = /\A\s*(([^@\s]{1,64})@((?:[-\p{L}\d]+\.)+\p{L}{2,}))\s*\z/i.freeze
|
|
8
|
+
EMAIL_STRICT = /\A\s*(([-\p{L}\d+._]{1,64})@((?:[-\p{L}\d]+\.)+\p{L}{2,}))\s*\z/i.freeze
|
|
9
9
|
|
|
10
10
|
protected
|
|
11
11
|
|
data/lib/regexy/web/hashtag.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Regexy
|
|
4
4
|
module Web
|
|
5
5
|
class Hashtag < ::Regexy::Regexp
|
|
6
|
-
HASHTAG = /\A#(?=.{2,140}\z)([0-9_\p{L}]*[_\p{L}][0-9_\p{L}]*)\z/
|
|
6
|
+
HASHTAG = /\A(#(?=.{2,140}\z)([0-9_\p{L}]*[_\p{L}][0-9_\p{L}]*))\z/ui.freeze
|
|
7
7
|
|
|
8
8
|
def initialize(*args)
|
|
9
9
|
super(HASHTAG, *args)
|
data/lib/regexy/web/ip.rb
CHANGED
|
@@ -3,7 +3,7 @@ module Regexy
|
|
|
3
3
|
PORT = /:([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\z/i.freeze
|
|
4
4
|
|
|
5
5
|
class IPv4 < ::Regexy::RegexpWithMode
|
|
6
|
-
IPV4_NORMAL = /\A(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\z/i.freeze
|
|
6
|
+
IPV4_NORMAL = /\A((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))\z/i.freeze
|
|
7
7
|
IPV4_WITH_PORT = (::Regexy::Regexp.new(IPV4_NORMAL) + PORT.source).freeze
|
|
8
8
|
|
|
9
9
|
protected
|
|
@@ -18,13 +18,13 @@ module Regexy
|
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
class IPv6 < ::Regexy::RegexpWithMode
|
|
21
|
-
IPV6_NORMAL = /\A(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}(?:[0-9]{1,3}\.){3}
|
|
21
|
+
IPV6_NORMAL = /\A((?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}(?:[0-9]{1,3}\.){3}
|
|
22
22
|
[0-9]{1,3}(?![:.\w]))(([0-9A-F]{1,4}:){0,5}|:)((:[0-9A-F]{1,4}){1,5}:|:)
|
|
23
23
|
|::(?:[A-F0-9]{1,4}:){5})(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|
|
|
24
24
|
[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
|
|
25
25
|
(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}
|
|
26
26
|
[A-F0-9]{0,4}(?![:.\w]))(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}
|
|
27
|
-
|:)|(?:[A-F0-9]{1,4}:){7}:|:(:[A-F0-9]{1,4}){7})(?![:.\w])\z
|
|
27
|
+
|:)|(?:[A-F0-9]{1,4}:){7}:|:(:[A-F0-9]{1,4}){7})(?![:.\w]))\z
|
|
28
28
|
/ix.freeze
|
|
29
29
|
|
|
30
30
|
IPV6_WITH_PORT = (::Regexy::Regexp.new(/\A\[/) + IPV6_NORMAL + /\]/ + PORT.source).freeze
|
data/lib/regexy/web/url.rb
CHANGED
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
module Regexy
|
|
4
4
|
module Web
|
|
5
5
|
class Url < ::Regexy::Regexp
|
|
6
|
-
URL = /\A([a-z][a-z\d+\-.]*:(\/\/([\p{L}\d\-._~%!$&'()*+,;=]+@)?([\p{L}\d\-._~%]+|
|
|
6
|
+
URL = /\A(([a-z][a-z\d+\-.]*:(\/\/([\p{L}\d\-._~%!$&'()*+,;=]+@)?([\p{L}\d\-._~%]+|
|
|
7
7
|
\[[\p{L}\d:.]+\]|\[v[a-f0-9][\p{L}\d\-._~%!$&'()*+,;=:]+\])(:[0-9]+)?
|
|
8
8
|
(\/[\p{L}\d\-._~%!$&'()*+,;=:@]+)*\/?|(\/?[\p{L}\d\-._~%!$&'()*+,;=:@]+
|
|
9
9
|
(\/[\p{L}\d\-._~%!$&'()*+,;=:@]+)*\/?)?)|([\p{L}\d\-._~%!$&'()*+,;=@]+
|
|
10
10
|
(\/[\p{L}\d\-._~%!$&'()*+,;=:@]+)*\/?|(\/[\p{L}\d\-._~%!$&'()*+,;=:@]+)
|
|
11
11
|
+\/?))
|
|
12
|
-
(\?[\p{L}\d\-._~%!$&'()*+,;=:@\/?]*)?(\#[\p{L}\d\-._~%!$&'()*+,;=:@\/?]*)
|
|
12
|
+
(\?[\p{L}\d\-._~%!$&'()*+,;=:@\/?]*)?(\#[\p{L}\d\-._~%!$&'()*+,;=:@\/?]*)?)\z
|
|
13
13
|
/ix.freeze
|
|
14
14
|
|
|
15
15
|
def initialize(*args)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: regexy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Vladimir Tikhonov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-03-
|
|
11
|
+
date: 2015-03-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rspec
|
|
@@ -84,10 +84,14 @@ files:
|
|
|
84
84
|
- Rakefile
|
|
85
85
|
- lib/regexy.rb
|
|
86
86
|
- lib/regexy/regexp.rb
|
|
87
|
+
- lib/regexy/text.rb
|
|
88
|
+
- lib/regexy/text/emoji.rb
|
|
89
|
+
- lib/regexy/text/smile.rb
|
|
87
90
|
- lib/regexy/version.rb
|
|
88
91
|
- lib/regexy/web.rb
|
|
89
92
|
- lib/regexy/web/email.rb
|
|
90
93
|
- lib/regexy/web/hashtag.rb
|
|
94
|
+
- lib/regexy/web/host_name.rb
|
|
91
95
|
- lib/regexy/web/ip.rb
|
|
92
96
|
- lib/regexy/web/url.rb
|
|
93
97
|
- regexy.gemspec
|