我有一个字符串[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)
}
但作为输出我只能获得所需的年收入',我怎样才能获得所有子串?
答案 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;,取决于你正在使用的正则表达式库。基金会似乎据说,默认是贪婪。
正则表达式并不总是超级简单/直接,但如果您经常进行文本处理,那么它就是一个非常强大的工具。