regexy 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|