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 代替NSRangelet range : Range? = string.rangeOfString("Swift")。您也可以将String 转换为NSStringvar 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 技术不同,这不需要创建数组,并且只需要扫描到第一次出现的字符,而不是将整个字符串分解为以字符分隔的数组。

【讨论】:

是的......它工作......但是如果我想在某个字符之后获取字符串怎么办? @Bhavin find(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&lt;String.Index&gt;类型,而不是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:如何获取某个字符之前的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何取一个字符串遇到某个字符之前的部分?

如何在倒数第二个 / 之前获取字符串

如何在swift中使用字符串获取

使用列表理解,如何在遇到某个 input/stop_word 之前获取用户输入?

如何在swift3中获取子字符串的范围? [复制]

如何从字符串 Swift 3 中获取 ALAssetURL?