Swift Language
NSRegularExpression i Swift
Sök…
Anmärkningar
Speciella karaktärer
*?+[(){}^$|\./
Utöka strängen för att göra enkel mönstermatchning
extension String {
func matchesPattern(pattern: String) -> Bool {
do {
let regex = try NSRegularExpression(pattern: pattern,
options: NSRegularExpressionOptions(rawValue: 0))
let range: NSRange = NSMakeRange(0, self.characters.count)
let matches = regex.matchesInString(self, options: NSMatchingOptions(), range: range)
return matches.count > 0
} catch _ {
return false
}
}
}
// very basic examples - check for specific strings
dump("Pinkman".matchesPattern("(White|Pinkman|Goodman|Schrader|Fring)"))
// using character groups to check for similar-sounding impressionist painters
dump("Monet".matchesPattern("(M[oa]net)"))
dump("Manet".matchesPattern("(M[oa]net)"))
dump("Money".matchesPattern("(M[oa]net)")) // false
// check surname is in list
dump("Skyler White".matchesPattern("\\w+ (White|Pinkman|Goodman|Schrader|Fring)"))
// check if string looks like a UK stock ticker
dump("VOD.L".matchesPattern("[A-Z]{2,3}\\.L"))
dump("BP.L".matchesPattern("[A-Z]{2,3}\\.L"))
// check entire string is printable ASCII characters
dump("tab\tformatted text".matchesPattern("^[\u{0020}-\u{007e}]*$"))
// Unicode example: check if string contains a playing card suit
dump("♠︎".matchesPattern("[\u{2660}-\u{2667}]"))
dump("♡".matchesPattern("[\u{2660}-\u{2667}]"))
dump("😂".matchesPattern("[\u{2660}-\u{2667}]")) // false
// NOTE: regex needs Unicode-escaped characters
dump("♣︎".matchesPattern("♣︎")) // does NOT work
Nedan är ett annat exempel som bygger på ovanstående för att göra något användbart, vilket inte lätt kan göras med någon annan metod och lämpar sig väl för en regex-lösning.
// Pattern validation for a UK postcode.
// This simply checks that the format looks like a valid UK postcode and should not fail on false positives.
private func isPostcodeValid(postcode: String) -> Bool {
return postcode.matchesPattern("^[A-Z]{1,2}([0-9][A-Z]|[0-9]{1,2})\\s[0-9][A-Z]{2}")
}
// valid patterns (from https://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation)
// will return true
dump(isPostcodeValid("EC1A 1BB"))
dump(isPostcodeValid("W1A 0AX"))
dump(isPostcodeValid("M1 1AE"))
dump(isPostcodeValid("B33 8TH"))
dump(isPostcodeValid("CR2 6XH"))
dump(isPostcodeValid("DN55 1PT"))
// some invalid patterns
// will return false
dump(isPostcodeValid("EC12A 1BB"))
dump(isPostcodeValid("CRB1 6XH"))
dump(isPostcodeValid("CR 6XH"))
Grundläggande användning
Det finns flera överväganden när man implementerar Regular Expressions i Swift.
let letters = "abcdefg"
let pattern = "[a,b,c]"
let regEx = try NSRegularExpression(pattern: pattern, options: [])
let nsString = letters as NSString
let matches = regEx.matches(in: letters, options: [], range: NSMakeRange(0, nsString.length))
let output = matches.map {nsString.substring(with: $0.range)}
//output = ["a", "b", "c"]
För att få en exakt avståndslängd som stöder alla teckentyper måste inmatningssträngen konverteras till en NSString.
För säkerhetsmatchning mot ett mönster bör ingå i ett fångstblock för att hantera fel
let numbers = "121314"
let pattern = "1[2,3]"
do {
let regEx = try NSRegularExpression(pattern: pattern, options: [])
let nsString = numbers as NSString
let matches = regEx.matches(in: numbers, options: [], range: NSMakeRange(0, nsString.length))
let output = matches.map {nsString.substring(with: $0.range)}
output
} catch let error as NSError {
print("Matching failed")
}
//output = ["12", "13"]
Regelbundna uttrycksfunktioner läggs ofta i en anknytning eller en hjälp för att separera oro.
Byt ut underlag
Mönster kan användas för att ersätta en del av en inmatningssträng.
Exemplet nedan ersätter cent-symbolen med dollarsymbolen.
var money = "¢¥€£$¥€£¢"
let pattern = "¢"
do {
let regEx = try NSRegularExpression (pattern: pattern, options: [])
let nsString = money as NSString
let range = NSMakeRange(0, nsString.length)
let correct$ = regEx.stringByReplacingMatches(in: money, options: .withTransparentBounds, range: range, withTemplate: "$")
} catch let error as NSError {
print("Matching failed")
}
//correct$ = "$¥€£$¥€£$"
Speciella karaktärer
För att matcha specialtecken bör du använda Double Backslash \. becomes \\.
Tecken du måste fly inkluderar
(){}[]/\+*$>.|^?
Nedanstående exempel får tre typer av öppningsfästen
let specials = "(){}[]"
let pattern = "(\\(|\\{|\\[)"
do {
let regEx = try NSRegularExpression(pattern: pattern, options: [])
let nsString = specials as NSString
let matches = regEx.matches(in: specials, options: [], range: NSMakeRange(0, nsString.length))
let output = matches.map {nsString.substring(with: $0.range)}
} catch let error as NSError {
print("Matching failed")
}
//output = ["(", "{", "["]
Godkännande
Regelbundna uttryck kan användas för att validera ingångar genom att räkna antalet matchningar.
var validDate = false
let numbers = "35/12/2016"
let usPattern = "^(0[1-9]|1[012])[-/.](0[1-9]|[12][0-9]|3[01])[-/.](19|20)\\d\\d$"
let ukPattern = "^(0[1-9]|[12][0-9]|3[01])[-/](0[1-9]|1[012])[-/](19|20)\\d\\d$"
do {
let regEx = try NSRegularExpression(pattern: ukPattern, options: [])
let nsString = numbers as NSString
let matches = regEx.matches(in: numbers, options: [], range: NSMakeRange(0, nsString.length))
if matches.count > 0 {
validDate = true
}
validDate
} catch let error as NSError {
print("Matching failed")
}
//output = false
NSRegularExpression för validering av e-post
func isValidEmail(email: String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: email)
}
eller så kan du använda String-förlängningen så här:
extension String
{
func isValidEmail() -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
return emailTest.evaluate(with: self)
}
}