NSPredicate SELF MATCHES doesn't work with simple contains regex

92 Views Asked by At

All I need is to check using NSPredicate and evaluate pattern if my string contains .page.link phrase.

extension String {
    func isValid(for string: String) -> Bool {
        NSPredicate(format: "SELF MATCHES %@", string).evaluate(with: self)
    }
}

let pattern = ".page.link" // "\\.page\\.link"

"joyone.page.link/abcd?title=abcd".isValid(for: pattern) //false
"joyone.page.link".isValid(for: pattern) //false
"joyone.nopage.link/abcd?title=abcd".isValid(for: pattern) //false

I know there is a simpler way to do this, but it is a part of something bigger, and my pattern is just case in enum.

First two should be true.

2

There are 2 best solutions below

0
vadian On BEST ANSWER

MATCHES considers always the whole string.

range(of:options:) can also talk Regex and is easier to use

extension String {
    func isValid(for pattern: String) -> Bool {
        range(of: pattern, options: .regularExpression) != nil
    }
}
2
Bartłomiej Semańczyk On

Of course @vadian answer is very correct and it is recommended, but here the solution is the following:

let pattern = ".{1,}\\.page\\.link.{1,}"

Thanks for the comment that it considers a whole string.