Swift:如何获取某个字符之前的字符串?
Posted
技术标签:
【中文标题】Swift:如何获取某个字符之前的字符串?【英文标题】:Swift : How to get the string before a certain character? 【发布时间】:2015-04-02 20:18:40 【问题描述】:如何快速获取某个字符之前的字符串?下面的代码是我在 Objective C 中的做法,但似乎无法在 Swift 中执行相同的任务。关于如何实现这一目标的任何提示或建议? rangeOfString
似乎在 swift 中根本不起作用(尽管 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, 选项:NSStringCompareOptions,范围:范围?,语言环境: NSLocale?)'
不确定我到底做错了什么或如何正确解决它。
【问题讨论】:
在this answer 中,他们还在 Swift 中使用 rangeOfString 并且它似乎有效。 我编辑了我的问题,以便更好地解释当我尝试应用您的解决方案时发生了什么。 您可以使用Range
代替NSRange
:let range : Range? = string.rangeOfString("Swift")
。您也可以将String
转换为NSString
:var range : NSRange = (string as NSString).rangeOfString("Swift")
【参考方案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])
【讨论】:
很棒的答案。我试图弄清楚如何使用 rangeOfString 完成这项任务,但这样效率更高。【参考方案2】:你可以对String
类提供的rangeOfString()
做同样的事情
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 更新:
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】:您可以在 Swift 4 或更高版本
中使用方法prefix(upTo:)var string = "hello Swift"
if let index = string.firstIndex(of: " ")
let firstPart = string.prefix(upTo: index)
print(firstPart) // print hello
【讨论】:
【参考方案5】:Swift 5 扩展
extension String
func before(first delimiter: Character) -> String
if let index = firstIndex(of: delimiter)
let before = prefix(upTo: index)
return String(before)
return ""
func after(first delimiter: Character) -> String
if let index = firstIndex(of: delimiter)
let after = suffix(from: index).dropFirst()
return String(after)
return ""
let str = "n1:lolz"
str.before(first: ":") // n1
str.after(first: ":") // lolz
str.after(first: "z") // empty string
str.before(first: "n") // empty string
str.before(first: "g") // empty string
我认为返回一个可选的String
是很有意义的(如果在分隔符之前或之后没有任何内容,则返回nil
)。
【讨论】:
【参考方案6】:我的 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)
用法1
"Hello, World!".strstr(needle: ",", beforeNeedle: true) // returns Hello
用法2
"Hello, World!".strstr(needle: " ") // returns World!
【讨论】:
【参考方案7】:如果您想要一个不涉及拉基础的解决方案,您可以使用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
技术不同,这不需要创建数组,并且只需要扫描到第一次出现的字符,而不是将整个字符串分解为以字符分隔的数组。
【讨论】:
是的......它工作......但是如果我想在某个字符之后获取字符串怎么办? @Bhavinfind(str, ",")?.successor()
@all find
不再在 Swift 2.0 中得到支持【参考方案8】:
要在指定的字符串第一次出现之前将字符串变异为部分,您可以像这样扩展字符串:
extension String
mutating func until(_ string: String)
let components = self.components(separatedBy: string)
self = components[0]
那么可以这样调用:
var foo = "Hello Swift"
foo.until(" Swift") // foo is now "Hello"
【讨论】:
【参考方案9】:你可以使用rangeOfString
,但它返回的是Range<String.Index>
类型,而不是NSRange
:
let string = "hello Swift"
if let range = string.rangeOfString("Swift")
print(string.substringToIndex(range.startIndex))
【讨论】:
【参考方案10】:let string = "Hello-world"
if let range = string.range(of: "-")
let firstPart = string[(string.startIndex)..<range.lowerBound]
print(firstPart)
输出是:你好
【讨论】:
【参考方案11】:下面是一个完整的组合
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
【讨论】:
以上是关于Swift:如何获取某个字符之前的字符串?的主要内容,如果未能解决你的问题,请参考以下文章