Мне нужно извлечь числа из строки и поместить их в новый массив в Swift.
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
Я попытался зациклировать все символы, и я не собираюсь сравнивать между символами и Int.
Мне нужно извлечь числа из строки и поместить их в новый массив в Swift.
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
Я попытался зациклировать все символы, и я не собираюсь сравнивать между символами и Int.
Сначала мы разделим строку, чтобы мы могли обрабатывать отдельные элементы. Затем мы используем NSCharacterSet
для выбора номеров.
import Foundation
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let strArr = str.split(separator: " ")
for item in strArr {
let components =
item.components(separatedBy: CharacterSet.decimalDigits.inverted)
let part: String = components.joined()
if let intVal = Int(part) {
print("this is a number -> \(intVal)")
}
}
let str = "Hello 1, World 62"
let intString = str.componentsSeparatedByCharactersInSet(
NSCharacterSet
.decimalDigitCharacterSet()
.invertedSet)
.joinWithSeparator("")
Это даст вам строку со всем номером, после чего вы можете просто сделать это:
let int = Int(intString)
Просто убедитесь, что вы развернете его, поскольку let int = Int(intString)
является необязательным.
Swift 3
let string = "0kaksd020dk2kfj2123"
if let number = Int(string.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()) {
// Do something with this number
}
С помощью функции регулярного выражения "регулярное выражение" из регулярного выражения Swift extract:
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
let regex = NSRegularExpression(pattern: regex,
options: nil, error: nil)!
let nsString = text as NSString
let results = regex.matchesInString(text,
options: nil, range: NSMakeRange(0, nsString.length))
as! [NSTextCheckingResult]
return map(results) { nsString.substringWithRange($0.range)}
}
вы можете легко достичь этого с помощью
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let numbersAsStrings = matchesForRegexInText("\\d+", str) // [String]
let numbersAsInts = numbersAsStrings.map { $0.toInt()! } // [Int]
println(numbersAsInts) // [3, 7, 10]
Образец "\d+"
соответствует одной или нескольким десятичным знакам.
Конечно, то же самое можно сделать без использования вспомогательной функции если вы предпочитаете это по любой причине:
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let regex = NSRegularExpression(pattern: "\\d+", options: nil, error: nil)!
let nsString = str as NSString
let results = regex.matchesInString(str, options: nil, range: NSMakeRange(0, nsString.length))
as! [NSTextCheckingResult]
let numbers = map(results) { nsString.substringWithRange($0.range).toInt()! }
println(numbers) // [3, 7, 10]
Альтернативное решение без регулярных выражений:
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let digits = "0123456789"
let numbers = split(str, allowEmptySlices: false) { !contains(digits, $0) }
.map { $0.toInt()! }
println(numbers) // [3, 7, 10]
Swift 2.2
let strArr = str.characters.split{$0 == " "}.map(String.init)
for item in strArr {
let components = item.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let part = components.joinWithSeparator("")
if let intVal = Int(part) {
print("this is a number -> \(intVal)")
}
}
// This will only work with single digit numbers. Works with "10eggs" (no space between number and word
var str = "I have to buy 3 apples, 7 bananas, 10eggs"
var ints: [Int] = []
for char:Character in str {
if let int = "\(char)".toInt(){
ints.append(int)
}
}
Трюк здесь в том, что вы можете проверить, является ли строка целым (но вы не можете проверить, есть ли символ).
Зацикливая каждый символ строки, используйте строчную интерполяцию, чтобы создать строку из символа и проверить, будет ли эта строка cas отлита как целое число.
Если это так, добавьте его в массив.
// This will work with multi digit numbers. Does NOT work with "10 eggs" (has to have a space between number and word)
var str = "I have to buy 3 apples, 7 bananas, 10 eggs"
var ints: [Int] = []
var strArray = split(str) {$0 == " "}
for subString in strArray{
if let int = subString.toInt(){
ints.append(int)
}
}
Здесь мы разделяем строку в любом пространстве и создаем массив каждой подстроки, которая находится в длинной строке.
Мы снова проверяем каждую строку, чтобы увидеть, является ли она (или может быть отлита как) целое число.
Адаптация из @flashadvanced answer, Я обнаружил, что для меня короче и проще.
let str = "I have to buy 3 apples, 7 bananas, 10eggs"
let component = str.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
let list = component.filter({ $0 != "" }) // filter out all the empty strings in the component
print(list)
Пробовал на игровой площадке и работает
Надеюсь, это поможет:)
Спасибо всем, кто ответил на мой вопрос.
Я искал блок кода, который использует только быструю грамматику, потому что я изучаю грамматику только сейчас.
У меня есть ответ на мой вопрос. Может быть, это не простой способ решить, но он использует только быстрый язык.
var article = "I have to buy 3 apples, 7 bananas, 10 eggs"
var charArray = Array(article)
var unitValue = 0
var total = 0
for char in charArray.reverse() {
if let number = "\(char)".toInt() {
if unitValue==0 {
unitValue = 1
}
else {
unitValue *= 10
}
total += number*unitValue
}
else {
unitValue = 0
}
}
println("I bought \(total) apples.")