[swift-evolution] Empower String type with regular expression

Kametrixom Tikara kametrixom at icloud.com
Tue Dec 8 17:19:17 CST 2015


I think we can extend this to something more general: VerbatimLiteralConvertible. A VerbatimLiteral would maybe start with a \" and end with "\ (Might not work with these delimiters). It would enable one to not have to escape special chars like " and \, so that they can be used just like that:

let verb = \"And he said: "\o/""\
let file = \"
First line
"Still in verbatim!
"\

We could then use this for the Reges type like:

struct Regex : VerbatimLiteralConvertible {
    init(verbatimLiteral value: String) {
        ...
    }
}

extension String {
    func match(regex: Regex) -> Range<String.Index>? {
        ...
    }
}

let matches = string.match(\"[a-z]"test"\)

Such a VerbatimLiteral also has the advantage of being able to copy-paste potentially big regex expressions in your code without the need to manually add all those "\" for escaping. Also it can be used to directly copy-past some text with correct line breaks and indentation.

I'd really love to see this, I'm just unsure of how the parser could delimit such a VerbatimLiteral.

Kame

> On 08 Dec 2015, at 23:41, Brent Royal-Gordon via swift-evolution <swift-evolution at swift.org> wrote:
> 
> 
>> 1. The semantics of the =~ operator in other languages maps to a return value of Int? - matching position or nil with no match. This means you would likely need to write if str =~ foo != nil { … }
> 
> Actually, I suspect the return value would be more like Range<String.Character.Index>?, or maybe even Regex.Match?. 
> 
>> 2. The semantics of the =~ operator produce state around matched groups, which is usually exposed to the language as either thread-local or block-local data.
> 
> This is hugely dependent on the language and I think it’s pretty obvious that Swift would take a return-value-based approach:
> 
>    if let match = string =~ /”([^\\”]*(\\[\\”][^\\”]*)*)”/ {
>        let quotedString = match.substrings[1]
>>    }
> 
>> For regex literals, my only concern is that it makes regex a language feature over an extended or standard library feature.
> 
> Not necessarily. The only thing that *has* to be in the language is support for parsing regex literals, and the only thing that has to be in the standard library is RegexLiteralConvertible. Even if there is a Regex type in the standard library, just that type could be dropped there without requiring huge compiler changes.
> 
> -- 
> Brent Royal-Gordon
> Architechies
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution


More information about the swift-evolution mailing list