Skip to content

Instantly share code, notes, and snippets.

@Qata
Last active July 3, 2017 05:15
Show Gist options
  • Save Qata/8695662c767a8a41e72ac37f4d7e450a to your computer and use it in GitHub Desktop.
Save Qata/8695662c767a8a41e72ac37f4d7e450a to your computer and use it in GitHub Desktop.
//
// RegexKit.swift
// RegexKit
//
// Created by Charlotte Tortorella on 3/7/17.
// Copyright © 2017 Monadic Consulting. All rights reserved.
//
import Foundation
indirect enum Regex {
case contains(String)
case begins(with: String)
case ends(with: String)
case has(CharacterSet)
case not(Regex)
case or(Regex, Regex)
case xor(Regex, Regex)
case and(Regex, Regex)
func evaluate(against target: String) -> Bool {
switch self {
case .contains(let string):
return target.contains(string)
case .begins(with: let string):
return target.hasPrefix(string)
case .ends(with: let string):
return target.hasSuffix(string)
case .has(let set):
return target.unicodeScalars.contains(where: set.contains(_:))
case .not(let regex):
return !regex.evaluate(against: target)
case .or(let lhs, let rhs):
return lhs.evaluate(against: target) || rhs.evaluate(against: target)
case .xor(let lhs, let rhs):
return lhs.evaluate(against: target) != rhs.evaluate(against: target)
case .and(let lhs, let rhs):
return lhs.evaluate(against: target) && rhs.evaluate(against: target)
}
}
}
extension String {
func match(regex: Regex) -> Bool {
return regex.evaluate(against: self)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment