Как отфильтровать объекты определенного типа из массива [AnyObject]

Следующие регулярные выражения будут соответствовать всем запятым, которые присутствуют вне двойных кавычек,

,(?=(?:[^"]*"[^"]*")*[^"]*$)

DEMO

ИЛИ (только для PCRE)

"[^"]*"(*SKIP)(*F)|,

"[^"]*" соответствует всем блокам с двойными кавычками. То есть в этом входе buz,"bar,foo" это регулярное выражение будет соответствовать только "bar,foo". Теперь следующий (*SKIP)(*F) делает совпадение неудачным. Затем он переходит к шаблону, который был рядом с символом | и пытается совместить символы с оставшейся строкой. То есть в нашем выходе , рядом с шаблоном | будет соответствовать только запятая, которая была сразу после buz. Обратите внимание, что это не будет соответствовать запятой, которая присутствовала внутри двойных кавычек, потому что мы уже пропустили пропущенную двойную кавычку.

DEMO


. Следующее регулярное выражение будет соответствовать всем запятым, которые присутствуют внутри двойных кавычек,

,(?!(?:[^"]*"[^"]*")*[^"]*$)

DEMO

0
задан user3727499 17 January 2019 в 14:09
поделиться

1 ответ

Я думаю, вы могли бы использовать что-то вроде этого ...

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"]

0
ответ дан Fogmeister 17 January 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: