Вы можете создать шаблон, чтобы найти любое количество цифр \d+
между двумя строками, используя оглядку (?<=)
и заглядывая в будущее (?=)
, создавая регулярное выражение, например (?<=64 bytes from \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} icmp_seq=#\d{1} type=ICMPv4TypeEchoReply time=)\d+(?=ms)
, и ищите вашу строку, пока вы находите совпадение:
func getTimes(from string: String) -> [Int] {
let pattern = #"(?<=64 bytes from \d{1,3}.\d{1,3}.\d{1,3}.\d{1,3} icmp_seq=#\d{1} type=ICMPv4TypeEchoReply time=)\d+(?=ms)"#
var times: [Int] = []
var startIndex = string.startIndex
while let range = string[startIndex...].range(of: pattern, options: .regularExpression) {
times.append(Int(string[range])!)
startIndex = range.upperBound
}
return times
}
Тестирование игровой площадки:
let string = """
start tcp connect
1\'s time=46ms, 2\'s time=14ms, 3\'s time=10ms, 4\'s time=24ms, 5\'s time=10ms, average=20ms
start tcp connect end
ping: XXX.XXX.com start
64 bytes from 111.111.111.111 icmp_seq=#0 type=ICMPv4TypeEchoReply time=10ms
64 bytes from 111.111.111.111 icmp_seq=#1 type=ICMPv4TypeEchoReply time=10ms
64 bytes from 111.111.111.111 icmp_seq=#2 type=ICMPv4TypeEchoReply time=34ms
ping: XXX.XXX.com end
"""
let times = getTimes(from: string)
print(times) // "[10, 10, 34]\n"