iro*_*oei 4 regex uitextfield ios uitextfielddelegate swift
所以我想在输入时验证用户的IP。在VC中,我执行以下操作:
extension NetworkSettingsViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
self.staticMask.resignFirstResponder()
self.staticGateway.resignFirstResponder()
self.staticIp.resignFirstResponder()
self.staticDns.resignFirstResponder()
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var isValidate: Bool
//verify deletion not happening
if !(range.length == 1) {
if validatorManager.verifyTarget(test: string) {
isValidate = true
} else {
isValidate = false
}
} else {
isValidate = true
}
return isValidate
}
Run Code Online (Sandbox Code Playgroud)
}
这是验证类:
class ValidatorManager: NSObject {
func verifyTarget(test: String) -> Bool {
// let validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
let validIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){0,3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?$"
let ipTest = NSPredicate(format:"SELF MATCHES %@", validIpAddressRegex)
print(ipTest.evaluate(with:test))
return ipTest.evaluate(with:test)
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了2正则表达式,但一无所获。我想按字符检查char,然后检查所有八位字节的dot()之前的所有3。
这里有两个功能:第一个功能检查用户键入的内容是否有效(未完成的IP),第二个功能检查整个内容:
func verifyWhileTyping(test: String) -> Bool {
let pattern_1 = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]){0,3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])?$"
let regexText_1 = NSPredicate(format: "SELF MATCHES %@", pattern_1)
let result_1 = regexText_1.evaluate(with: test)
return result_1
}
func verifyWholeIP(test: String) -> Bool {
let pattern_2 = "(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})"
let regexText_2 = NSPredicate(format: "SELF MATCHES %@", pattern_2)
let result_2 = regexText_2.evaluate(with: test)
return result_2
}
Run Code Online (Sandbox Code Playgroud)
使用verifyWhileTyping(test:)中textField(_ textField: , shouldChangeCharactersIn range:, replacementString string:)要检查在打字时。当用户完成操作并单击按钮或按下Enter键时verifyWholeIP(test:):
//While typing
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text {
verifyWhileTyping(test: text + string)
}
//...
}
//When Enter is tapped
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
if let text = textField.text {
verifyWholeIP(test: text)
}
//...
return true
}
Run Code Online (Sandbox Code Playgroud)
pattern_1 检查用户输入的内容是否是正确IP的开头:
regexText_1.evaluate(with: "0") //true
regexText_1.evaluate(with: "255") //true
regexText_1.evaluate(with: "256") //false
regexText_1.evaluate(with: "10.10.") //true
regexText_1.evaluate(with: "1.2..") //false
regexText_1.evaluate(with: "1.2.3.4") //true
regexText_1.evaluate(with: "1.2.3.4.") //false
Run Code Online (Sandbox Code Playgroud)
至于pattern_2,它评估整个IPv4:
"(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})\\.(25[0-5]|2[0-4]\\d|1\\d{2}|\\d{1,2})"
Run Code Online (Sandbox Code Playgroud)
这是更多测试用例:
regexText_2.evaluate(with: "0.0.0.0") //true
regexText_2.evaluate(with: "1.1.1.256") //false
regexText_2.evaluate(with: "-1.0.1.2") //false
regexText_2.evaluate(with: "12.34.56") //false
regexText_2.evaluate(with: "I.am.an.IP") //false
Run Code Online (Sandbox Code Playgroud)
对于IPv6,此正则表达式要使用:"[0-9A-Fa-f]{1,4}"中pattern_2。
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |