【问题标题】:How to create date regex with Swift?如何使用 Swift 创建日期正则表达式?
【发布时间】:2019-04-20 19:41:36
【问题描述】:

我正在尝试为日期创建一个正则表达式字符串,例如this。我的代码(Swift 5 示例):

let dateValidator = TextValidator(input: dateTextField.rx.text.asObservable(), regex: try! NSRegularExpression(pattern:
    #"^\s*(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})\s*$"#))

let v = Observable.combineLatest(dateValidator.validate(), anotherValidator.validate()) {
    (date, another) in
    return date && another
}
//another code

class TextValidator {
    var input: Observable<String?>
    var regex: NSRegularExpression

    init(input: Observable<String?>, regex: NSRegularExpression) {
        self.input = input
        self.regex = regex
    }

    func validate() -> Observable<Bool> {
        return input.map { text in
            let range = NSRange(location: 0, length: text!.utf8.count)
            return self.regex.firstMatch(in: text!, options: [], range: range) != nil
        }
    }
}

我得到错误:

由于未捕获的异常“NSRangeException”而终止应用程序,原因: '*** -[NSRegularExpression enumerateMatchesInString:options:range:usingBlock:]:范围或索引 越界”

另一个正则表达式正常工作。我认为正则表达式中的反斜杠错误。

【问题讨论】:

  • 但是没有Detector怎么创建呢?只有 dd.mm.yyyy 的正则表达式
  • 我的 NSRange 代码工作正常,正则表达式行有问题
  • 我将 utf8 更改为 utf16 并且我的所有验证器都无法正常工作(返回 false,我认为(项目没有崩溃))...
  • 如果 utf16 - 我没有错误。代码v.bind(to: saveNewItemBarButtonItem.rx.isEnabled).disposed(by: self.disposeBag) 未设置启用我的条形按钮项

标签: ios swift regex rx-swift


【解决方案1】:

在获取 Swift StringNSRange 时,您希望使用 utf16 而不是 utf8

func validate() -> Observable<Bool> {
    return input.map { text in
        guard let text = text else { return false }
        let range = NSRange(location: 0, length: text.utf16.count)
        return self.regex.firstMatch(in: text, range: range) != nil
    }
}

就个人而言,我发现选择 utf8utf16 之间的逻辑不必要地不透明,我使用 NSRange(_:in:) 初始化器:

func validate() -> Observable<Bool> {
    return input.map { text in
        guard let text = text else { return false }
        let range = NSRange(text.startRange..., in: text)
        return self.regex.firstMatch(in: text, range: range) != nil
    }
}

话虽如此,在构建 NSRange 时使用 utf8.count 只会在字符串中包含非 ASCII 字符时才会出现崩溃。这可能解释了为什么当您使用utf16 修复此问题时,为什么崩溃消失了,但您的验证仍然失败。字符串必须包含扩展的 Unicode 字符,因此根据定义,不符合正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多