Skip to content

Commit 5b61082

Browse files
committed
fix AGRegex Structure
1 parent d213340 commit 5b61082

File tree

7 files changed

+93
-85
lines changed

7 files changed

+93
-85
lines changed

AGString.xcodeproj/project.pbxproj

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@
99
/* Begin PBXBuildFile section */
1010
2FBE39ED2377C7B700D65251 /* AGRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB3A5A1236EF1B30041D167 /* AGRegex.swift */; };
1111
2FBE39EE2377C7B700D65251 /* AGMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD02777323701C86007DCFB6 /* AGMatch.swift */; };
12-
2FBE39EF2377C7B700D65251 /* AGMatchIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchIterator.swift */; };
12+
2FBE39EF2377C7B700D65251 /* AGMatchListIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchListIterator.swift */; };
1313
2FBE39F02377C7B700D65251 /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF6C86D12372D77B004C83A0 /* String+NSRange.swift */; };
1414
2FBE39F12377C7B700D65251 /* StringIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5EFC82236EF301005134D1 /* StringIndex.swift */; };
1515
2FBE39F22377C7B700D65251 /* Utility.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF4F190B236F126000A0CD30 /* Utility.swift */; };
1616
2FBE39F32377C7C000D65251 /* AGRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB3A5A1236EF1B30041D167 /* AGRegex.swift */; };
1717
2FBE39F42377C7C000D65251 /* AGMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD02777323701C86007DCFB6 /* AGMatch.swift */; };
18-
2FBE39F52377C7C000D65251 /* AGMatchIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchIterator.swift */; };
18+
2FBE39F52377C7C000D65251 /* AGMatchListIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchListIterator.swift */; };
1919
2FBE39F62377C7C000D65251 /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF6C86D12372D77B004C83A0 /* String+NSRange.swift */; };
2020
2FBE39F72377C7C000D65251 /* StringIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5EFC82236EF301005134D1 /* StringIndex.swift */; };
2121
2FBE39F82377C7C000D65251 /* Utility.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF4F190B236F126000A0CD30 /* Utility.swift */; };
2222
2FBE39F92377C7C600D65251 /* AGRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB3A5A1236EF1B30041D167 /* AGRegex.swift */; };
2323
2FBE39FA2377C7C600D65251 /* AGMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD02777323701C86007DCFB6 /* AGMatch.swift */; };
24-
2FBE39FB2377C7C600D65251 /* AGMatchIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchIterator.swift */; };
24+
2FBE39FB2377C7C600D65251 /* AGMatchListIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchListIterator.swift */; };
2525
2FBE39FC2377C7C600D65251 /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF6C86D12372D77B004C83A0 /* String+NSRange.swift */; };
2626
2FBE39FD2377C7C600D65251 /* StringIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5EFC82236EF301005134D1 /* StringIndex.swift */; };
2727
2FBE39FE2377C7C600D65251 /* Utility.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF4F190B236F126000A0CD30 /* Utility.swift */; };
@@ -45,7 +45,11 @@
4545
BD02777823701DB4007DCFB6 /* AGRegexTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD02777523701DA2007DCFB6 /* AGRegexTest.swift */; };
4646
BD02777923701DB7007DCFB6 /* AGRegexTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD02777523701DA2007DCFB6 /* AGRegexTest.swift */; };
4747
BDB3A5A2236EF1B30041D167 /* AGRegex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDB3A5A1236EF1B30041D167 /* AGRegex.swift */; };
48-
BDDA016223703F820001AF7C /* AGMatchIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchIterator.swift */; };
48+
BDDA016223703F820001AF7C /* AGMatchListIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDA016123703F820001AF7C /* AGMatchListIterator.swift */; };
49+
FF2593DA237827DE003C3B1F /* AGMatchList.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2593D9237827DE003C3B1F /* AGMatchList.swift */; };
50+
FF2593DB237827E5003C3B1F /* AGMatchList.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2593D9237827DE003C3B1F /* AGMatchList.swift */; };
51+
FF2593DC237827E5003C3B1F /* AGMatchList.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2593D9237827DE003C3B1F /* AGMatchList.swift */; };
52+
FF2593DD237827E5003C3B1F /* AGMatchList.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF2593D9237827DE003C3B1F /* AGMatchList.swift */; };
4953
FF4F190C236F126000A0CD30 /* Utility.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF4F190B236F126000A0CD30 /* Utility.swift */; };
5054
FF5EFC83236EF301005134D1 /* StringIndex.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5EFC82236EF301005134D1 /* StringIndex.swift */; };
5155
FF6C86D22372D77B004C83A0 /* String+NSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF6C86D12372D77B004C83A0 /* String+NSRange.swift */; };
@@ -129,7 +133,8 @@
129133
BD02777323701C86007DCFB6 /* AGMatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AGMatch.swift; sourceTree = "<group>"; };
130134
BD02777523701DA2007DCFB6 /* AGRegexTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AGRegexTest.swift; sourceTree = "<group>"; };
131135
BDB3A5A1236EF1B30041D167 /* AGRegex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AGRegex.swift; sourceTree = "<group>"; };
132-
BDDA016123703F820001AF7C /* AGMatchIterator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AGMatchIterator.swift; sourceTree = "<group>"; };
136+
BDDA016123703F820001AF7C /* AGMatchListIterator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AGMatchListIterator.swift; sourceTree = "<group>"; };
137+
FF2593D9237827DE003C3B1F /* AGMatchList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AGMatchList.swift; sourceTree = "<group>"; };
133138
FF4F190B236F126000A0CD30 /* Utility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utility.swift; sourceTree = "<group>"; };
134139
FF5EFC82236EF301005134D1 /* StringIndex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringIndex.swift; sourceTree = "<group>"; };
135140
FF6C86D12372D77B004C83A0 /* String+NSRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+NSRange.swift"; sourceTree = "<group>"; };
@@ -299,8 +304,9 @@
299304
children = (
300305
BDB3A5A1236EF1B30041D167 /* AGRegex.swift */,
301306
BD02777323701C86007DCFB6 /* AGMatch.swift */,
302-
BDDA016123703F820001AF7C /* AGMatchIterator.swift */,
307+
BDDA016123703F820001AF7C /* AGMatchListIterator.swift */,
303308
FF6C86D12372D77B004C83A0 /* String+NSRange.swift */,
309+
FF2593D9237827DE003C3B1F /* AGMatchList.swift */,
304310
);
305311
path = Regex;
306312
sourceTree = "<group>";
@@ -692,10 +698,11 @@
692698
buildActionMask = 2147483647;
693699
files = (
694700
FF4F190C236F126000A0CD30 /* Utility.swift in Sources */,
695-
BDDA016223703F820001AF7C /* AGMatchIterator.swift in Sources */,
701+
BDDA016223703F820001AF7C /* AGMatchListIterator.swift in Sources */,
696702
FF5EFC83236EF301005134D1 /* StringIndex.swift in Sources */,
697703
BD02777423701C86007DCFB6 /* AGMatch.swift in Sources */,
698704
3D9C42A222745900000A6585 /* AGString.swift in Sources */,
705+
FF2593DA237827DE003C3B1F /* AGMatchList.swift in Sources */,
699706
FF6C86D22372D77B004C83A0 /* String+NSRange.swift in Sources */,
700707
BDB3A5A2236EF1B30041D167 /* AGRegex.swift in Sources */,
701708
);
@@ -707,9 +714,10 @@
707714
files = (
708715
2FBE39ED2377C7B700D65251 /* AGRegex.swift in Sources */,
709716
2FBE39EE2377C7B700D65251 /* AGMatch.swift in Sources */,
710-
2FBE39EF2377C7B700D65251 /* AGMatchIterator.swift in Sources */,
717+
2FBE39EF2377C7B700D65251 /* AGMatchListIterator.swift in Sources */,
711718
2FBE39F02377C7B700D65251 /* String+NSRange.swift in Sources */,
712719
2FBE39F12377C7B700D65251 /* StringIndex.swift in Sources */,
720+
FF2593DB237827E5003C3B1F /* AGMatchList.swift in Sources */,
713721
2FBE39F22377C7B700D65251 /* Utility.swift in Sources */,
714722
3D9C42B1227459C1000A6585 /* AGString.swift in Sources */,
715723
);
@@ -721,9 +729,10 @@
721729
files = (
722730
2FBE39F32377C7C000D65251 /* AGRegex.swift in Sources */,
723731
2FBE39F42377C7C000D65251 /* AGMatch.swift in Sources */,
724-
2FBE39F52377C7C000D65251 /* AGMatchIterator.swift in Sources */,
732+
2FBE39F52377C7C000D65251 /* AGMatchListIterator.swift in Sources */,
725733
2FBE39F62377C7C000D65251 /* String+NSRange.swift in Sources */,
726734
2FBE39F72377C7C000D65251 /* StringIndex.swift in Sources */,
735+
FF2593DC237827E5003C3B1F /* AGMatchList.swift in Sources */,
727736
2FBE39F82377C7C000D65251 /* Utility.swift in Sources */,
728737
3D9C42BF227459F6000A6585 /* AGString.swift in Sources */,
729738
);
@@ -735,9 +744,10 @@
735744
files = (
736745
2FBE39F92377C7C600D65251 /* AGRegex.swift in Sources */,
737746
2FBE39FA2377C7C600D65251 /* AGMatch.swift in Sources */,
738-
2FBE39FB2377C7C600D65251 /* AGMatchIterator.swift in Sources */,
747+
2FBE39FB2377C7C600D65251 /* AGMatchListIterator.swift in Sources */,
739748
2FBE39FC2377C7C600D65251 /* String+NSRange.swift in Sources */,
740749
2FBE39FD2377C7C600D65251 /* StringIndex.swift in Sources */,
750+
FF2593DD237827E5003C3B1F /* AGMatchList.swift in Sources */,
741751
2FBE39FE2377C7C600D65251 /* Utility.swift in Sources */,
742752
3D9C42CD22745A28000A6585 /* AGString.swift in Sources */,
743753
);

Sources/Regex/AGMatch.swift

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,16 @@
88

99
import Foundation
1010

11-
public typealias AGSpan = (Int, Int)
11+
public typealias AGSpan = NSRange
1212

13-
public struct AGMatch {
13+
public struct AGMatch: Equatable {
1414
let start: Int
1515
let end: Int
16-
let base: String
1716
private let groups: [String]
1817

1918
public init(start: Int, end: Int, base: String, groups: [String]) {
2019
self.start = start
2120
self.end = end
22-
self.base = base
2321
self.groups = groups
2422
}
2523
}
@@ -28,22 +26,16 @@ extension AGMatch {
2826
public var groupCount: Int {
2927
return groups.count
3028
}
31-
public func group(_ index: Int) -> String {
29+
30+
public func group(_ index: Int = 0) -> String {
3231
guard index < groups.count else {
3332
return ""
3433
}
3534

3635
return groups[index]
3736
}
3837

39-
public func group() -> String {
40-
guard let result = groups.first else {
41-
return ""
42-
}
43-
44-
return result
45-
}
4638
public var span: AGSpan {
47-
return (start, end)
39+
return NSRange(location: start, length: start + end)
4840
}
4941
}

Sources/Regex/AGMatchIterator.swift

Lines changed: 0 additions & 17 deletions
This file was deleted.

Sources/Regex/AGMatchList.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
//
2+
// AGMatchList.swift
3+
// AGString-iOS
4+
//
5+
// Created by 조수환 on 2019/11/10.
6+
// Copyright © 2019 AGString. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
public struct AGMatchList: Sequence, Equatable {
12+
public typealias Iterator = AGMatchListIterator
13+
public typealias Element = AGMatch
14+
15+
public let baseString: String
16+
private let list: [Element]
17+
18+
init(withBase base: String, matching matchList: [Element]) {
19+
baseString = base
20+
list = matchList
21+
}
22+
23+
public var first: AGMatch? {
24+
return list.first
25+
}
26+
27+
public var last: AGMatch? {
28+
return list.last
29+
}
30+
31+
public __consuming func makeIterator() -> AGMatchList.Iterator {
32+
return AGMatchListIterator(list.makeIterator())
33+
}
34+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//
2+
// AGMatchIterator.swift
3+
// AGString-iOS
4+
//
5+
// Created by tskim on 2019/11/04.
6+
// Copyright © 2019 AGString. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
public struct AGMatchListIterator: IteratorProtocol {
12+
public typealias Element = AGMatch
13+
14+
var iterator: IndexingIterator<[AGMatch]>
15+
public mutating func next() -> AGMatchListIterator.Element? {
16+
return iterator.next()
17+
}
18+
19+
init(_ iterator: IndexingIterator<[AGMatch]>) {
20+
self.iterator = iterator
21+
}
22+
}

Sources/Regex/AGRegex.swift

Lines changed: 3 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,14 @@ public class AGRegex {
1919

2020
extension AGRegex {
2121

22-
public func findAll(_ str: String) -> [AGMatch] {
22+
public func getMatchList(_ str: String) -> AGMatchList {
2323

2424
let matched = regex.matches(
2525
in: str,
2626
options: [],
2727
range: NSRange(location: 0, length: str.count))
2828

29-
return matched.map {
30-
var group: [String] = []
31-
32-
for index in 0 ..< $0.numberOfRanges {
33-
group.append(str[$0.range(at: index)])
34-
}
35-
36-
return AGMatch(start: $0.range.lowerBound, end: $0.range.upperBound,
37-
base: str, groups: group)
38-
}
39-
}
40-
41-
public func first(_ str: String) -> AGMatch? {
42-
let matched = regex.firstMatch(
43-
in: str,
44-
options: [],
45-
range: NSRange(location: 0, length: str.count))
46-
47-
return matched.map {
29+
let mapped: [AGMatch] = matched.map {
4830
var group: [String] = []
4931

5032
for index in 0 ..< $0.numberOfRanges {
@@ -55,10 +37,7 @@ extension AGRegex {
5537
base: str, groups: group)
5638
}
5739

58-
}
59-
60-
public func last(_ str: String) -> AGMatch? {
61-
return findAll(str).last
40+
return AGMatchList(withBase: str, matching: mapped)
6241
}
6342

6443
public func sub(str: String, replace: String, count: Int = Int.max) -> String {
@@ -77,8 +56,4 @@ extension AGRegex {
7756

7857
return result
7958
}
80-
81-
public func finditer(_ str: String) -> IndexingIterator<[AGMatch]> {
82-
return self.findAll(str).makeIterator()
83-
}
8459
}

Tests/AGRegexTest.swift

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,20 @@ class AGRegexTest: XCTestCase {
1616
let r = try! NSRegularExpression(pattern: "ai", options: [])
1717
let regex = AGRegex(r)
1818
let str = "The rain in Spain"
19-
let actual = regex.findAll(str)
20-
let expect = [
21-
AGMatch(start: 5, end: 7, base: str, groups: ["ai"]),
22-
AGMatch(start: 14, end: 16, base: str, groups: ["ai"]),
23-
]
19+
let actual = regex.getMatchList(str)
20+
let expect = AGMatchList(withBase: str, matching: [
21+
AGMatch(start: 5, end: 7, base: str, groups: ["ai"]),
22+
AGMatch(start: 14, end: 16, base: str, groups: ["ai"]),
23+
])
24+
2425
XCTAssertEqual(actual, expect)
2526
}
2627

2728
func testFirstMatch() {
2829
let r = try! NSRegularExpression(pattern: "ai", options: [])
2930
let regex = AGRegex(r)
3031
let str = "The rain in Spain"
31-
let actual = regex.first(str)
32+
let actual = regex.getMatchList(str).first
3233
let expect = AGMatch(start: 5, end: 7, base: str, groups: ["ai"])
3334
XCTAssertEqual(actual, expect)
3435
}
@@ -37,7 +38,7 @@ class AGRegexTest: XCTestCase {
3738
let r = try! NSRegularExpression(pattern: "ai", options: [])
3839
let regex = AGRegex(r)
3940
let str = "The rain in Spain"
40-
let actual = regex.last(str)
41+
let actual = regex.getMatchList(str).last
4142
let expect = AGMatch(start: 14, end: 16, base: str, groups: ["ai"])
4243
XCTAssertEqual(actual, expect)
4344
}
@@ -74,7 +75,7 @@ class AGRegexTest: XCTestCase {
7475
]
7576

7677
var testCount = 0
77-
for (i, m) in regex.finditer(str).enumerated() {
78+
for (i, m) in regex.getMatchList(str).enumerated() {
7879
let actual = "\(m.group(2)) * \(m.group(1))"
7980
let expect = expects[i]
8081
XCTAssertEqual(actual, expect)
@@ -84,12 +85,3 @@ class AGRegexTest: XCTestCase {
8485
XCTAssertEqual(testCount, 4)
8586
}
8687
}
87-
88-
extension AGMatch: Equatable {
89-
public static func == (lhs: Self, rhs: Self) -> Bool {
90-
return lhs.base == rhs.base &&
91-
lhs.start == rhs.start &&
92-
lhs.end == rhs.end &&
93-
lhs.groupCount == rhs.groupCount
94-
}
95-
}

0 commit comments

Comments
 (0)