Следующие регулярные выражения будут соответствовать всем запятым, которые присутствуют вне двойных кавычек,
,(?=(?:[^"]*"[^"]*")*[^"]*$)
ИЛИ (только для PCRE)
"[^"]*"(*SKIP)(*F)|,
"[^"]*"
соответствует всем блокам с двойными кавычками. То есть в этом входе buz,"bar,foo"
это регулярное выражение будет соответствовать только "bar,foo"
. Теперь следующий (*SKIP)(*F)
делает совпадение неудачным. Затем он переходит к шаблону, который был рядом с символом |
и пытается совместить символы с оставшейся строкой. То есть в нашем выходе ,
рядом с шаблоном |
будет соответствовать только запятая, которая была сразу после buz
. Обратите внимание, что это не будет соответствовать запятой, которая присутствовала внутри двойных кавычек, потому что мы уже пропустили пропущенную двойную кавычку.
. Следующее регулярное выражение будет соответствовать всем запятым, которые присутствуют внутри двойных кавычек,
,(?!(?:[^"]*"[^"]*")*[^"]*$)
Я думаю, вы могли бы использовать что-то вроде этого ...
let filteredArray = array.compactMap { [110] as? RequiredType }
Это отфильтрует массив и вернет типизированный массив, содержащий только тот тип, который вам нужен.
Сказав это. В Swift вы должны избегать разнородных массивов, где это возможно. Массивы должны содержать только один тип элементов.
Проверено на детской площадке ...
let array: [Any] = [1, "hello", 3, 3.1415, "world"]
let filteredArray = array.compactMap { [111] as? String }
filteredArray
Вывод:
filteredArray = ["hello", "world"]