快速查找和更改属性字符串中的范围

时间:2018-08-08 21:12:59

标签: swift replace attributes nsattributedstring nsmutableattributedstring

更改此字符串的最佳方法是什么?

<mat-form-field [floatLabel]="'never'">
  <mat-placeholder *ngIf="!input.value">Choose a date</mat-placeholder>
  <input #input matInput [matDatepicker]="picker">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>

转换为属性字符串,同时摆脱<>中的部分,我想更改(Cooldown:90s)的字体。我知道如何更改和制作NSMutableAttributedStrings,但是在这种情况下,我只限于如何定位和更改(冷却时间:90年代)。 "gain quickness for 5 seconds. <c=@reminder>(Cooldown: 90s)</c> only after" <c=@reminder>之间的文本将更改,因此我需要使用它们来查找所需的内容。

这些似乎是旨在用于此目的的指标,我只是不知道。

1 个答案:

答案 0 :(得分:0)

首先,您需要一个正则表达式来查找和替换所有带标签的字符串。

看一看字符串,一个可能的正则表达式可能是<c=@([a-zA-Z-9]+)>([^<]*)</c>。请注意,只有在标签之间的字符串不包含<字符的情况下,此方法才有效。

现在有了正则表达式,我们只需要将其应用于输入字符串:

let str = "gain quickness for 5 seconds. <c=@reminder>(Cooldown: 90s)</c> only after"
let attrStr = NSMutableAttributedString(string: str)
let regex = try! NSRegularExpression(pattern: "<c=@([a-zA-Z-9]+)>([^<]*)</c>", options: [])
while let match = regex.matches(in: attrStr.string, options: [], range: NSRange(location: 0, length: attrStr.string.utf16.count)).first {
    let indicator = str[Range(match.range(at: 1), in: str)!]
    let substr = str[Range(match.range(at: 2), in: str)!]
    let replacement = NSMutableAttributedString(string: String(substr))
    // now based on the indicator variable you might want to apply some transformations in the `substr` attributed string
    attrStr.replaceCharacters(in: match.range, with: replacement)
}