[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