Skip to content

Instantly share code, notes, and snippets.

@ztrehagem
Last active June 7, 2023 02:50
Show Gist options
  • Save ztrehagem/7ce726ea731753436f43783fd1fc874d to your computer and use it in GitHub Desktop.
Save ztrehagem/7ce726ea731753436f43783fd1fc874d to your computer and use it in GitHub Desktop.
正規表現でStringやAttributedStringをマッチするやつ
import Foundation
extension AttributedStringProtocol {
func match(_ pattern: String, options: String.CompareOptions? = nil) -> Range<AttributedString.Index>? {
let options = options?.union(.regularExpression) ?? .regularExpression
return self.range(of: pattern, options: options)
}
func matchAll(_ pattern: String, options: String.CompareOptions? = nil) -> [Range<AttributedString.Index>] {
guard let range = match(pattern, options: options) else {
return []
}
let remaining = self[range.upperBound...]
return [range] + remaining.matchAll(pattern, options: options)
}
func contains(pattern: String, options: String.CompareOptions? = nil) -> Bool {
match(pattern, options: options) != nil
}
}
import Foundation
struct RegularExpression {
let pattern: String
let options: String.CompareOptions
init(_ pattern: String, options: String.CompareOptions? = nil) {
self.pattern = pattern
self.options = options?.union(.regularExpression) ?? .regularExpression
}
func matchAll<T: StringProtocol>(_ input: T) -> [Range<T.Index>] {
guard let range = input.range(of: pattern, options: options) else {
return []
}
let remaining = input[range.upperBound...]
return [range] + matchAll(remaining)
}
@available(iOS 15, *)
func matchAll<T: AttributedStringProtocol>(_ input: T) -> [Range<AttributedString.Index>] {
guard let range = input.range(of: pattern, options: options) else {
return []
}
let remaining = input[range.upperBound...]
return [range] + matchAll(remaining)
}
}
import Foundation
extension StringProtocol {
func match(_ pattern: String, options: String.CompareOptions? = nil) -> Range<Index>? {
let options = options?.union(.regularExpression) ?? .regularExpression
return self.range(of: pattern, options: options)
}
func matchAll(_ pattern: String, options: String.CompareOptions? = nil) -> [Range<Index>] {
guard let range = match(pattern, options: options) else {
return []
}
let remaining = self[range.upperBound...]
return [range] + remaining.matchAll(pattern, options: options)
}
func contains(pattern: String, options: String.CompareOptions? = nil) -> Bool {
match(pattern, options: options) != nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment