regexp-examples 0.1.0 → 0.2.0
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 +8 -8
- data/README.md +5 -2
- data/lib/regexp-examples/backreferences.rb +8 -9
- data/lib/regexp-examples/groups.rb +1 -1
- data/lib/regexp-examples/helpers.rb +19 -1
- data/lib/regexp-examples/version.rb +1 -1
- data/spec/regexp-examples_spec.rb +3 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OWJkMDYzMDJhNjQ2ZWE1YmZjZjM4NWViMThmYWVmMjA0ODBkZmZhNg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Yjk3YTM5ZjNiMTdkODEwNmVjZGM2YTMzMTMzODA3OTE5YWFiMjE5Zg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MDc5YTA3MTdkMWQ0MmQ4OTk5Mzg4MjRlMWNhOTUxMTA0NWZjZDY3MmY1ZDc5
|
10
|
+
YjE2MWM3YTgxODgwZmFkYmEwMDY4MzdjZDg3OTQ1NWE5ZDFjNWE4NTIzYjhh
|
11
|
+
OWY1OTk4ZWU3ODE2YWIxMTg2Mzg0ZmQxYjNkNzgzNjNmNzU1ZDU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTJiMjA3NjY5ZDk0ODJjNDVmYjk5ZjczNjU5MDk4OGQ1N2NjZWNhODFiNDVj
|
14
|
+
Y2IxZGFmYzZhMzgzYTZhOTdiNDYwYWM4YzA0NDg3NmM1YzIwOWE5ZTc2ODNl
|
15
|
+
ZGMzMTdlZjhiYTY2NDI4NGIwNTVlOWViYjhjYzNmMmNlMGUxNGQ=
|
data/README.md
CHANGED
@@ -29,9 +29,12 @@ or a huge number of possible matches, such as `/.\w/`, then only a subset of the
|
|
29
29
|
* Boolean "Or" groups, e.g. `/a|b|c/`
|
30
30
|
* Character sets (inluding ranges and negation!), e.g. `/[abc]/`, `/[A-Z0-9]/`, `/[^a-z]/`
|
31
31
|
* Escaped characters, e.g. `/\n/`, `/\w/`, `/\D/` (and so on...)
|
32
|
-
* Capture groups, including named groups and backreferences(!!), e.g. `/(this|that) \1/` `/(?<name>foo) \k<name>/`
|
33
32
|
* Non-capture groups, e.g. `/(?:foo)/`
|
34
|
-
*
|
33
|
+
* Capture groups, e.g. `/(group)/`
|
34
|
+
* Including named groups, e.g. `/?(<name>group)/`
|
35
|
+
* ...And backreferences(!!!), e.g. `/(this|that) \1/` `/(?<name>foo) \k<name>/`
|
36
|
+
* Groups work fine, even if nested! e.g. `/(even(this(works?))) \1 \2 \3/`
|
37
|
+
* **Arbitrarily complex combinations of all the above!**
|
35
38
|
|
36
39
|
## Not-Yet-Supported syntax
|
37
40
|
|
@@ -7,10 +7,15 @@ module RegexpExamples
|
|
7
7
|
super(values)
|
8
8
|
end
|
9
9
|
|
10
|
+
def all_subgroups
|
11
|
+
[self, subgroups].flatten
|
12
|
+
end
|
13
|
+
|
10
14
|
# Overridden in order to preserve the @group_id and @subgroups
|
11
15
|
def *(int)
|
12
16
|
self.class.new(group_id, subgroups, super)
|
13
17
|
end
|
18
|
+
# Overridden in order to preserve the @group_id and @subgroups
|
14
19
|
def gsub(regex)
|
15
20
|
self.class.new(group_id, subgroups, super)
|
16
21
|
end
|
@@ -36,16 +41,10 @@ module RegexpExamples
|
|
36
41
|
def find_backref_for(full_example, group_id)
|
37
42
|
full_example.each do |partial_example|
|
38
43
|
next unless partial_example.respond_to?(:group_id)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
when sub_partial_example = find_backref_for(partial_example.subgroups, group_id)
|
43
|
-
# TODO: This line does NOT work for all nested backreference groups
|
44
|
-
# Need to revisit this logic and find a better solution, if possible
|
45
|
-
return sub_partial_example.result.detect{|sub_partial_result| partial_example.include? sub_partial_result}
|
46
|
-
end
|
44
|
+
partial_example.all_subgroups.each do |subgroup|
|
45
|
+
return subgroup if subgroup.group_id == group_id
|
46
|
+
end
|
47
47
|
end
|
48
|
-
nil
|
49
48
|
end
|
50
49
|
|
51
50
|
end
|
@@ -78,8 +78,8 @@ module RegexpExamples
|
|
78
78
|
# itself
|
79
79
|
def result
|
80
80
|
strings = @groups.map {|repeater| repeater.result}
|
81
|
-
subgroups = @groups.select{ |repeater| repeater.group.respond_to? :group_id}.map{|repeater| repeater.group}
|
82
81
|
RegexpExamples::permutations_of_strings(strings).map do |result|
|
82
|
+
subgroups = result.respond_to?(:group_id) ? result.all_subgroups : []
|
83
83
|
group_id ? CaptureGroupResult.new(group_id, subgroups, result) : result
|
84
84
|
end
|
85
85
|
end
|
@@ -11,7 +11,25 @@ module RegexpExamples
|
|
11
11
|
first = arrays_of_strings.shift
|
12
12
|
return first if arrays_of_strings.empty?
|
13
13
|
first.product( permutations_of_strings(arrays_of_strings, options) ).map do |result|
|
14
|
-
options[:no_join]
|
14
|
+
if options[:no_join]
|
15
|
+
result.flatten
|
16
|
+
else
|
17
|
+
join_preserving_capture_groups(result)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.join_preserving_capture_groups(result)
|
23
|
+
result.flatten!
|
24
|
+
subgroups = result
|
25
|
+
.select { |partial| partial.respond_to? :group_id }
|
26
|
+
.map(&:all_subgroups)
|
27
|
+
.flatten
|
28
|
+
|
29
|
+
if subgroups.empty?
|
30
|
+
result.join
|
31
|
+
else
|
32
|
+
CaptureGroupResult.new(nil, subgroups, result.join)
|
15
33
|
end
|
16
34
|
end
|
17
35
|
|
@@ -86,7 +86,9 @@ describe Regexp, "#examples" do
|
|
86
86
|
/(repeat) \1/,
|
87
87
|
/(ref1) (ref2) \1 \2/,
|
88
88
|
/((ref2)ref1) \1 \2/,
|
89
|
-
/((ref1and2)) \1 \2
|
89
|
+
/((ref1and2)) \1 \2/,
|
90
|
+
/(one)(two)(three)(four)(five)(six)(seven)(eight)(nine)(ten) \10\9\8\7\6\5\4\3\2\1/,
|
91
|
+
/(a?(b?(c?(d?(e?)))))/
|
90
92
|
)
|
91
93
|
end
|
92
94
|
|