swift 3 查找以换行符开头和结尾的文本范围:

swift 3 find range of text starting with newline and ending with :

我有一个 swift 3 字符串,如下所示:

var str:String = "first name: \nkevin\nlast name:\nwilliams"

打印出来后是这样的:

first name: 
kevin
last name:
williams
xxx field:
408 878 2125

我想找到以“\n”开头并以“:”结尾的字段范围,以便我可以将属性应用于它们。字段名称可能会有所不同。例如,在其他情况下我可以使用 "phone number:" 或 "address:"。我如何在 swift 3 中执行此操作?

例如,我想将斜体应用于字段名称。所以结果可能是:

名字: 凯文

姓氏: 威廉姆斯

xxx 字段: 408 878 2125

(冒号后面的空格被Whosebug格式化了)

一个通用且合适的解决方案是正则表达式

let string = "first name: \nkevin\nlast name:\nwilliams"

let pattern = "\n?(.*):"
do {
    let regex = try NSRegularExpression(pattern: pattern)
    let matches = regex.matches(in: string, range: NSRange(string.startIndex..., in: string))
    for match in matches {
        let swiftRange = Range(match.rangeAt(1), in: string)!
        print(string[swiftRange])
    }
} catch {
    print("Regex Error:", error)
}

顺便说一句:第一个条目不以 \n

开头

另一种方法 --- IF 你知道字符串的格式是

fieldName1: \nfieldValue1\nfieldName2: \nfieldValue2\n etc

var str:String = "first name: \nkevin\nlast name:\nwilliams\nphone:\n212.555.1212"

var charsToClear = NSMutableCharacterSet(charactersIn: ":")
charsToClear.formUnion(with: .whitespaces)

let parts = str.components(separatedBy: "\n").map{ [=10=].trimmingCharacters(in: charsToClear as CharacterSet) }

这会将字符串拆分为交替的 fieldNamefieldValue 数组。它还会 trim 额外的空格和冒号。所以这个示例字符串将变成一个数组,其中包含:

[ "first name", "kevin", "last name", "williams", "phone", "212.555.1212" ]

然后您可以通过遍历数组、分配您想要的任何格式来创建属性字符串。

一如既往,根据需要实施错误检查。