【问题标题】:swift 3 find range of text starting with newline and ending with :swift 3查找以换行符开头并以以下结尾的文本范围:
【发布时间】:2017-11-24 18:46:17
【问题描述】:

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

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

打印出来后是这样的:

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

我想找到以“\n”开头并以“:”结尾的字段范围,以便我可以对它们应用属性。字段名称可能会有所不同。例如,在其他情况下,我可能有“电话号码:”或“地址:”。我如何在 swift 3 中做到这一点?

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

名字: 凯文

姓氏: 威廉姆斯

xxx 字段: 408 878 2125

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

【问题讨论】:

  • 最好尝试并充分解释您想要开始的操作...您是否对每个“word1 word2:”行应用相同的属性?还是您要删除换行符?也许展示一个你希望最终结果看起来如何的例子? “字段名称可能会有所不同...” 会有 3 个“字段名称” - 还是可能有 10 个? 20? 50?
  • 我已经进行了编辑。如果您需要更多说明,请告诉我

标签: ios swift3 nsattributedstring nsrange


【解决方案1】:

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

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开头的

【讨论】:

  • 不应该有-1 NSRange(location: 0, length: string.utf16.count - 1)
  • @SoheilNovinfard 不,不应该。 length 参数不是索引。但我更新了推荐的 Swift 4+ 语法的答案。
【解决方案2】:

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

fieldName1:\nfieldValue1\nfieldName2:\nfieldValue2\n 等

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{ $0.trimmingCharacters(in: charsToClear as CharacterSet) }

这会将字符串拆分为交替的 fieldNamefieldValue 的数组。它还将修剪多余的空格和冒号。所以这个示例字符串将被转换成一个数组,其中包含:

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

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

与往常一样,根据需要实施错误检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2015-05-08
    • 2020-07-17
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多