Регулярное выражение для соответствия валюты "23a" в неожиданных случаях - PullRequest
0 голосов
/ 26 мая 2020

Используя следующий код на игровой площадке, моя тестовая строка «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 Ответ

1 голос
/ 26 мая 2020

Ваша проблема в вашей третьей группе захвата.? Вам нужно экранировать точку, иначе он будет интерпретирован как любой символ:

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})$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...