от
Когда строка начинается и заканчивается подчеркиванием, я делаю эту строку курсивом. После этого я убираю подчеркивания. Это работает нормально, если строка похожа на эту
"_hello_ world"
Тем не менее, это не работает
=> "_hello_ world _happy_"
Это мое регулярное выражение =>
"\\_(.*?)\\_"
func applyItalicFormat(string: String) {
        let matches = RegexPattern.italicRegex.matches(string)
        for match in matches {
            let mRange = match.range
            self.addAttributes([NSAttributedStringKey.font : UIFont.latoMediumItalic(size: 15)],
                               range: mRange)

            if let rangeObj = Range(NSMakeRange(mRange.location, mRange.upperBound), in: string) {
                var sub = string.substring(with: rangeObj)
                sub = sub.replacingOccurrences(of: "_", with: "")

                print("sub is \(sub)")

                replaceCharacters(in: mRange, with: sub)
            } else {

            }
        }
    }
             

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

2 Ответы

0 голосов
от
Другой формат Regex,
\\_(?:(?!_).) \\_
и использующий
map
var mySentence = "This is from _mcdonal_ mac _system_ which says that _below_ answer is one of the _easiest_ way"
var wholeText = NSMutableAttributedString()

override func viewDidLoad() {
    super.viewDidLoad()

    wholeText = NSMutableAttributedString(string: mySentence)
    italicLbl.attributedText = matches(for: "\\_(?:(?!_).) \\_", in: mySentence)
}


func matches(for regex: String, in text: String) 

Скриншот


    
0 голосов
от
С небольшими модификациями и использованием
range(at:)
из матчей:
extension NSMutableAttributedString {
    func applyItalicFormat(pattern: String) {
        let regex = try! NSRegularExpression(pattern: pattern, options: [])
        let matches = regex.matches(in: string, options: [], range: NSRange(location: 0, length: string.utf16.count))
        let italicAttributes = [NSAttributedString.Key.font: UIFont.italicSystemFont(ofSize: 15)]
        for match in matches.reversed() {
            let textRange = match.range(at: 1)
            let attributedTextToChange = NSMutableAttributedString(attributedString: self.attributedSubstring(from: textRange))
            attributedTextToChange.addAttributes(italicAttributes, range: NSRange(location: 0, length: attributedTextToChange.length))
            replaceCharacters(in: match.range, with: attributedTextToChange)
        }
    }
}
Вам не нужно заменять
_
, у вас уже есть хороший диапазон текста без подчеркивания. Я использую
matches.reversed()
, потому что когда вы применяете первый, диапазон уже найденного второго больше не корректен (вы удаляете дважды
_
). Я предпочитаю извлекать часть приписываемой строки, чтобы изменить, изменить ее, а затем заменить ее измененной. Я упростил немного остальной части кода. Образец теста (можно использовать на детской площадке):
let initialTexts = ["_hello_ world", "\n\n", "_hello_ world _happy_"]
let label = UILabel.init(frame: CGRect(x: 0, y: 0, width: 500, height: 500))
label.backgroundColor = .orange
label.numberOfLines = 0

let attr = NSMutableAttributedString()

for anInitialText in initialTexts {
    let attributedStr = NSMutableAttributedString(string: anInitialText)
    attributedStr.applyItalicFormat(pattern: "\\_(.*?)\\_")
    attr.append(attributedStr)
}

label.attributedText = attr
    
Добро пожаловать на сайт ByNets, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...