如何从字符串中查找大括号内的多个子字符串?

时间:2018-04-23 09:52:33

标签: ios string swift3 substring

我有一个字符串[Desired Annual Income] /([Income per loan %] /100)

使用此字符串,我必须找到两个子字符串' Desired Annual Income'和每个贷款的收入%'在Swift3中。

我正在使用以下代码来实现此目标' How do I get the substring between braces?':

  let myString = "[Desired Annual Income]  /([Income per loan %] /100)"
  let start: NSRange = (myString as NSString).range(of: "[")
  let end: NSRange = (myString as NSString).range(of: "]")
   if start.location != NSNotFound && end.location != NSNotFound && end.location > start.location {
      let result: String = (myString as NSString).substring(with: NSRange(location: start.location + 1, length: end.location - (start.location + 1)))          
      print(result)
   }

但作为输出我只能获得所需的年收入',我怎样才能获得所有子串?

2 个答案:

答案 0 :(得分:0)

试试这个, 希望它能起作用

let str = "[Desired Annual Income]  /([Income per loan %] /100)"
let trimmedString = str.components(separatedBy: "]")
for i in 0..<trimmedString.count - 1{ // not considering last component since it's of no use hence count-1 times loop
    print(trimmedString[i].components(separatedBy: "[").last ?? "")
}

输出: -

Desired Annual Income
Income per loan %

答案 1 :(得分:0)

这是正则表达式(NSRegularExpression)的一个非常好的用例。正则表达式的原则是描述&#34;模式&#34;你想要搜索一个字符串。

在这种情况下,您可以搜索两个括号之间的内容。

代码是:

    let str = "[Desired Annual Income]  /([Income per loan %] /100)"

    if let regex = try? NSRegularExpression(pattern: "\\[(.+?)\\]", options: [.caseInsensitive]) {
        var collectMatches: [String] = []
        for match in regex.matches(in: str, options: [], range: NSRange(location: 0, length: (str as NSString).length)) {
            // range at index 0: full match (including brackets)
            // range at index 1: first capture group
            let substring = (str as NSString).substring(with: match.range(at: 1))
            collectMatches.append(substring)
        }
        print(collectMatches)
    }

关于正则表达式的解释,有很多关于互联网的教程。但是很短:

\\[\\]:开括号和右括号字符(双反斜杠是因为括号在正则表达式中有意义,所以你需要将它们转义。在文本编辑器中,一个反斜杠就足够了,但是你需要第二个因为你在String并且需要使用反斜杠来反斜杠。

(.+?)有点复杂:括号是&#34;捕获组&#34;,你想得到什么。 .表示&#34;任何字符&#34;,+一个或多个时间,?+是贪婪的运算符,这意味着您需要捕获尽快停止。如果你没有把它,你的捕获可以在你的情况下&#34;期望的年收入] /([每个贷款的收入%&#34;,取决于你正在使用的正则表达式库。基金会似乎据说,默认是贪婪。

正则表达式并不总是超级简单/直接,但如果您经常进行文本处理,那么它就是一个非常强大的工具。