出现意外情况时,货币匹配“ 23a”的正则表达式

时间:2020-05-25 22:08:36

标签: swift nsregularexpression

在操场上使用以下代码,我的测试字符串“ 23a”与我的测试匹配,我不确定为什么。

     extension String {
         var isCurrencyString: Bool {
             return currencyString == self
         }

         var currencyString: String {
             let input = self as NSString

             guard let decimalSeparator = NSLocale.current.decimalSeparator
                 , let groupingSeparator = NSLocale.current.groupingSeparator
                 else { return "" }

             let testPattern = "^-?([0-9]{1,3}(\(groupingSeparator)?[0-9])*)(\(decimalSeparator)?[0-9]{0,2})$"

             guard let expression = try? NSRegularExpression(pattern: testPattern) else { return "" }

             let matches = expression.matches(in: self, options: [], range: NSMakeRange(0, input.length)).map {
                 input.substring(with: $0.range)
             }

             return matches.first ?? ""
         }
     }

     let tester = "23a"

     print(tester.currencyString)    //23a
     print(tester.isCurrencyString)  //true

1 个答案:

答案 0 :(得分:1)

您的问题出在您的第三个捕获小组。您需要转义该句点,否则它将被解释为任何字符:

guard 
    var decimalSeparator = NSLocale.current.decimalSeparator, 
    var groupingSeparator = NSLocale.current.groupingSeparator
else { return "" }
if groupingSeparator ==  "." { groupingSeparator = #"\."# }
if decimalSeparator ==  "." { decimalSeparator = #"\."# }

您还应该将第二个捕获组中的位数设置为3

尝试

let testPattern = "^-?([0-9]{1,3}(\(groupingSeparator)?[0-9]{3})*)(\(decimalSeparator)?[0-9]{0,2})$"
相关问题