Look no further, the iterator in a loop context is an actual iterator and lazy:
for groups in props["(\\w+)\\s*=\\s*(.*)"] { params[String(groups[1]!)] = String(groups[2]!) } If you break half way through the remaining matches will not have been performed. This is as opposed to the following which would be exhaustive. if let allGroupsOfAllMatches: [[Substring?]] = props["(\\w+)\\s*=\\s*(.*)"] { for groups in allGroupsOfAllMatches { params[String(groups[1]!)] = String(groups[2]!) } } > On 11 Jan 2018, at 18:15, C. Keith Ray <keith...@mac.com> wrote: > > That looks great. One thing I would look for is iterating over multiple > matches in a string. I'd want to see lazy and non-lazy sequences. > > let wordMatcher = Regex(":w*") // or whatever matches word-characters > // separated by non-word character. > > for w in aString[allMatches: wordMatcher] { print(w) } > > for w in warAndPeaceNovel[allMatchesLazy: wordMatcher].prefix(50) { > print(w) } > > -- > C. Keith Ray > > * https://leanpub.com/wepntk <https://leanpub.com/wepntk> <- buy my book? > * http://www.thirdfoundationsw.com/keith_ray_resume_2014_long.pdf > <http://www.thirdfoundationsw.com/keith_ray_resume_2014_long.pdf> > * http://agilesolutionspace.blogspot.com/ > <http://agilesolutionspace.blogspot.com/> > > On Jan 11, 2018, at 9:50 AM, John Holdsworth via swift-evolution > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: > >> Hi Michael, >> >> Thanks for sending this through. It’s an interesting read. One section gave >> me pause however. I feel Swift should resist the siren call of combining >> Swift Syntax with Regex syntax as it falls on the wrong side of Occam's >> razor. ISO Regex syntax is plenty complex enough without trying to >> incorporate named capture, desirable as it may be. Also, if I was to go down >> that route, I’d move away from / as the delimiter which is a carry over from >> Perl to something like e”I am a regex” to give the lexer more to go on which >> could represent say, a cached instance of NSRegularExpression. >> >> And now for something completely different... >> >> Common usage patterns for a regex fall into 4 categories: deconstruction, >> replacement, iteration and switch/case. Ideally the representation of a >> regex match would the same for all four of these categories and I’d like to >> argue a set of expressive regex primitives can be created without building >> them into the language. >> >> I’ve talked before about a regex match being coded as a string/regex >> subscripting into a string and I’ve been able to move this forward since >> last year. While this seems like an arbitrary operator to use it has some >> semantic sense in that you are addressing a sub-part of the string with >> pattern as you might use an index or a key. Subscripts also have some very >> interesting properties in Swift compared to other operators or functions: >> You don’t have to worry about precedence, they can be assigned to, used as >> an interator, and I've learned since my last email on this topic that the >> Swift type checker will disambiguate multiple subscript overloads on the >> basis of the type of the variable is being assigned to. >> >> An extension to String can now realise the common use cases by judicious use >> of types: >> >> var input = "Now is the time for all good men to come to the aid of the >> party" >> >> if input["\\w+"] { >> print("match") >> } >> >> // receiving type controls data you get >> if let firstMatch: Substring = input["\\w+"] { >> print("match: \(firstMatch)") >> } >> >> if let groupsOfFirstMatch: [Substring?] = input["(all) (\\w+)"] { >> print("groups: \(groupsOfFirstMatch)") >> } >> >> // "splat" out up to N groups of first match >> if let (group1, group2): (String, String) = input["(all) (\\w+)"] { >> print("group1: \(group1), group2: \(group2)") >> } >> >> if let allGroupsOfAllMatches: [[Substring?]] = input["(\\w)(\\w*)"] { >> print("allGroups: \(allGroupsOfAllMatches)") >> } >> >> // regex replace by assignment >> input["men"] = "folk" >> print(input) >> >> // parsing a properties file using regex as iterator >> let props = """ >> name1 = value1 >> name2 = value2 >> """ >> >> var params = [String: String]() >> for groups in props["(\\w+)\\s*=\\s*(.*)"] { >> params[String(groups[1]!)] = String(groups[2]!) >> } >> print(params) >> >> The case for switches is slightly more opaque in order to avoid executing >> the match twice but viable. >> >> let match = RegexMatch() >> switch input { >> case RegexPattern("(\\w)(\\w*)", capture: match): >> let (first, rest) = input[match] >> print("\(first) \(rest)") >> default: >> break >> } >> >> This is explored in the attached playground (repo: >> https://github.com/johnno1962/SwiftRegex4 >> <https://github.com/johnno1962/SwiftRegex4>) >> <SwiftRegex4.playground.zip> >> >> I’m not sure I really expect this to take off as an idea but I’d like to >> make sure it's out there as an option and it certainly qualifies as “out >> there”. >> >> John >> >>> On 10 Jan 2018, at 19:58, Michael Ilseman via swift-evolution >>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote: >>> >>> Hello, I just sent an email to swift-dev titled "State of String: ABI, >>> Performance, Ergonomics, and You!” at >>> https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20180108/006407.html >>> >>> <https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20180108/006407.html>, >>> whose gist can be found at >>> https://gist.github.com/milseman/bb39ef7f170641ae52c13600a512782f >>> <https://gist.github.com/milseman/bb39ef7f170641ae52c13600a512782f>. I >>> posted to swift-dev as much of the content is from an implementation >>> perspective, but it also addresses many areas of potential evolution. >>> Please refer to that email for details; here’s the recap from it: >>> >>> ### Recap: Potential Additions for Swift 5 >>> >>> * Some form of unmanaged or unsafe Strings, and corresponding APIs >>> * Exposing performance flags, and some way to request a scan to populate >>> them >>> * API gaps >>> * Character and UnicodeScalar properties, such as isNewline >>> * Generalizing, and optimizing, String interpolation >>> * Regex literals, Regex type, and generalized pattern match destructuring >>> * Substitution APIs, in conjunction with Regexes. >>> >>> _______________________________________________ >>> swift-evolution mailing list >>> swift-evolution@swift.org <mailto:swift-evolution@swift.org> >>> https://lists.swift.org/mailman/listinfo/swift-evolution >>> <https://lists.swift.org/mailman/listinfo/swift-evolution> >> >> _______________________________________________ >> swift-evolution mailing list >> swift-evolution@swift.org <mailto:swift-evolution@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-evolution >> <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution