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

Ios 如何从字符串中查找大括号中的多个子字符串?,ios,string,swift3,substring,Ios,String,Swift3,Substring,我有一个字符串[期望年收入]/([每笔贷款的收入%]/100) 使用这个字符串,我必须在Swift3中找到两个子字符串“期望年收入”和“每笔贷款收入%” 我正在使用以下代码来实现此“”: 但作为一种产出,我只能得到“期望的年收入”,我怎么能得到所有的子串呢?试试这个, 希望它能起作用 let str = "[Desired Annual Income] /([Income per loan %] /100)" let trimmedString = str.components(separat

我有一个字符串
[期望年收入]/([每笔贷款的收入%]/100)

使用这个字符串,我必须在Swift3中找到两个子字符串“期望年收入”和“每笔贷款收入%”

我正在使用以下代码来实现此“”:

但作为一种产出,我只能得到“期望的年收入”,我怎么能得到所有的子串呢?

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

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 ?? "")
}

这是正则表达式(
NSRegularExpression
)的一个非常好的用例。正则表达式的原理是描述要在字符串中搜索的“模式”

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

代码是:

    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)
    }
关于正则表达式的解释,互联网上有很多教程。但简而言之:

\\[
\\]
:开始和结束括号字符(双反斜杠是因为括号在正则表达式中有意义,所以需要对其进行转义。在文本编辑器中,一个反斜杠就足够了,但您需要第二个反斜杠,因为您位于
字符串中,并且需要转义反斜杠才能使用反斜杠

(.+?)
有点复杂:括号是“捕获组”,即您想要获得的内容。
表示“任何字符”,
+
一次或多次,
后面的是贪婪运算符,这意味着您希望捕获尽快停止。如果您不放置它,您的捕获可能就在您的情况下“期望的年收入”/ [(每贷款收入%),取决于您使用的正则表达式库。基金会似乎默认是贪婪的。
Regex并不总是超级简单/直接,但如果你经常进行文本处理,它是一个非常强大的工具。

你期望输出的OP应该是期望的年收入和每笔贷款的收入%。它还将输出
[
之前和之后的前导和尾随字符
]
@RatulSharker不,不会
Desired Annual Income
Income per loan %
    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)
    }