+
может иметь два значения, в зависимости от контекста.
Как и другие упомянутые ответы, +
обычно является оператором повторения и вызывает предыдущий токен повторять один или несколько раз. a+
будет выражаться как aa*
в теории формального языка , а также может быть выражена как a{1,}
(соответствует минимум 1 раз и максимум бесконечного раза).
Однако +
также может делать другие кванторы притяжательной , если он следует за оператором повторения (т.е. ?+
, *+
, ++
или {m,n}+
). Притяжательный квантификатор - это расширенная функция некоторых ароматов регулярных выражений (PCRE, Java и JGsoft engine), которая говорит движку не возвращаться назад после того, как было выполнено совпадение.
Чтобы понять, как это работает, нам нужно понять две концепции двигателей регулярных выражений: жадность и backtracking . Жадность означает, что в общем случае регулярные выражения будут пытаться потреблять столько символов, сколько могут. Скажем, наш паттерн .*
( dot - специальная конструкция в регулярных выражениях, что означает любой символ 1, звезда означает совпадение ноль или более раз), а ваша цель есть aaaaaaaab
. Вся строка будет потребляться, потому что вся строка является самым длинным совпадением, которое удовлетворяет шаблону.
Однако, скажем, мы меняем шаблон на .*b
. Теперь, когда движок регулярного выражения пытается сопоставлять aaaaaaaab
, .*
снова потребляет всю строку. Однако, поскольку двигатель достигнет конца строки, а шаблон еще не выполнен (.*
потребляет все, но шаблон все же должен соответствовать b
впоследствии), он будет backtrack , по одному символу за раз, и попытайтесь сопоставить b
. Первый откат заставит .*
потреблять aaaaaaaa
, а затем b
может потреблять b
, и шаблон преуспевает.
Потенциальные квантификаторы также жадные, но, как уже упоминалось, после их возвращения матч, двигатель больше не может вернуться назад. Поэтому, если мы изменим наш шаблон на .*+b
(сопоставим любой символ ноль или более раз, собственнически, а затем b
) и попытаемся сопоставить aaaaaaaab
, снова .*
будет потреблять всю строку, но затем поскольку он является притяжательным, информация об отбрасывании отбрасывается, а b не может быть сопоставлена, поэтому шаблон не работает.
1 В большинстве движков точка не будет соответствовать символу новой строки, если только /s
(опция «singleline» или «dotall») .
Вы можете попробовать
do {
let form = DateFormatter()
form.dateFormat = "yyy-MM-dd HH:mm:ss"
let dec = JSONDecoder()
dec.keyDecodingStrategy = .convertFromSnakeCase
dec.dateDecodingStrategy = .formatted(form)
let res = try dec.decode(Root.self,from:dataNew)
print(res)
}
catch {
print(error)
}
struct Root: Codable {
let status: String
let answer: Answer
}
struct Answer: Codable {
let address, name: String
let createdAt, updatedAt: Date
let userType: Int
}
Этот
DispatchQueue.main.async {
должен быть внутри обратного вызова для любого обновления пользовательского интерфейса, поскольку по умолчанию session.dataTask(with:
выполняется в фоновом потоке