Swift: Как получить строку перед определенным символом?
Как получить строку перед определенным символом в swift? Ниже приведен код, как я это сделал в Objective C, но, похоже, не может выполнять одну и ту же задачу в Swift. Любые советы или предложения о том, как достичь этого? rangeOfString
похоже, не работает вообще в быстрой (хотя Swift снова действует на меня).
NSRange range = [time rangeOfString:@" "];
NSString *startDate =
[time substringToIndex:range.location];
Как вы можете видеть из приведенного выше кода, я могу получить строку перед символом пробела в Objective C.
Изменить: если я попробую что-то вроде этого
var string = "hello Swift"
var range : NSRange = string.rangeOfString("Swift")
Я получаю следующую ошибку.
Невозможно преобразовать тип выражения 'NSString' в тип '(String, options: NSStringCompareOptions, диапазон: Range?, locale: NSLocale?)
Не уверен, что я сделал неправильно или как правильно его решить.
Ответы
Ответ 1
Используйте componentsSeparatedByString(), как показано ниже:
var delimiter = " "
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])
Или использовать ваш конкретный случай:
var delimiter = " token1"
var newstr = "token0 token1 token2 token3"
var token = newstr.components(separatedBy: delimiter)
print (token[0])
Ответ 2
Вы можете сделать то же самое с rangeOfString()
, предоставленным String
классом
let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
let firstPart = string[string.startIndex..<range.startIndex]
print(firstPart) // print Hello
}
Вы также можете выполнить его с помощью своего метода substringToIndex()
let string = "Hello Swift"
if let range = string.rangeOfString("Swift") {
firstPart = string.substringToIndex(range.startIndex)
print(firstPart) // print Hello
}
Swift 3 UPDATE:
let string = "Hello Swift"
if let range = string.range(of: "Swift") {
let firstPart = string[string.startIndex..<range.lowerBound]
print(firstPart) // print Hello
}
Надеюсь, это поможет вам;)
Ответ 3
После ответа Syed Tariq: Если вы хотите только строку перед разделителем (в противном случае вы получите массив [String]):
var token = newstr.components(separatedBy: delimiter).first
Ответ 4
Если вы хотите получить решение, которое не включает в себя создание основы, вы можете сделать это с помощью find
и нарезки:
let str = "Hello, I must be going."
if let comma = find(str, ",") {
let substr = str[str.startIndex..<comma]
// substr will be "Hello"
}
Если вам явно нужна пустая строка в случае, когда такой символ не найден, вы можете использовать оператор nil-coalescing:
let str = "no comma"
let comma = find(str, ",") ?? str.startIndex
let substr = str[str.startIndex..<comma] // substr will be ""
Примечание. В отличие от метода componentsSeparatedByString
это не требует создания массива и требует только сканирования до первого появления символа, а не разбиения всей строки на массив с разделителями символов.
Ответ 5
Мои 2 цента:-) с помощью Swift 3.0, аналогично PHP strstr
extension String {
func strstr(needle: String, beforeNeedle: Bool = false) -> String? {
guard let range = self.range(of: needle) else { return nil }
if beforeNeedle {
return self.substring(to: range.lowerBound)
}
return self.substring(from: range.upperBound)
}
}
Usage1
"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello
Usage2
"Hello, World!".strstr(needle: " ") // returns World!
Ответ 6
Чтобы мутировать String в часть до первого появления указанной строки, вы можете расширить String следующим образом:
extension String {
mutating func until(_ string: String) {
var components = self.components(separatedBy: string)
self = components[0]
}
}
Это можно так назвать:
var foo = "Hello Swift"
foo.until(" Swift") // foo is now "Hello"
Ответ 7
Вы можете использовать rangeOfString
, но он возвращает тип Range<String.Index>
, а не NSRange
:
let string = "hello Swift"
if let range = string.rangeOfString("Swift") {
print(string.substringToIndex(range.startIndex))
}
Ответ 8
let string = "Hello-world"
if let range = string.range(of: "-") {
let firstPart = string[(string.startIndex)..<range.lowerBound]
print(firstPart)
}
Вывод: Hello
Ответ 9
Ниже приведен вид целой комбо
let string = "This a string split using * and this is left."
if let range = string.range(of: "*") {
let lastPartIncludingDelimiter = string.substring(from: range.lowerBound)
print(lastPartIncludingDelimiter) // print * and this is left.
let lastPartExcludingDelimiter = string.substring(from: range.upperBound)
print(lastPartExcludingDelimiter) // print and this is left.
let firstPartIncludingDelimiter = string.substring(to: range.upperBound)
print(firstPartIncludingDelimiter) // print This a string split using *
let firstPartExcludingDelimiter = string.substring(to: range.lowerBound)
print(firstPartExcludingDelimiter) // print This a string split using
}
Ответ 10
Вы можете использовать префикс метода (upTo :) в Swift 4 или выше
var string = "hello Swift"
if let index = string.firstIndex(of: " ") {
let firstPart = string.prefix(upTo: index)
print(firstPart) // print hello
}