Получить строку из подстроки - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующая строка "@[Hema](hema_ramburuth), @[Ilesh P](ilesh.panchal), @[Lewis Murphy](lewis) how are you?". Я хочу отобразить этот экран следующим образом "Hema, Ilesh P, Lewis Murphy how are you? ", также я хочу идентифицировать экран для события щелчка.

Я использовал репозиторий ActiveLabel для клика.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Как видно из вашего вопроса, просто парсинг жесткого кода сделан ниже.

    let fullString = "@[Hema](hema_ramburuth), @[Ilesh P](ilesh.panchal), @[Lewis Murphy](lewis) how are you?"
    let allarray = fullString.split(separator: ",")
    let messageArray = allarray.last
    let message = messageArray?.split(separator: ")")
    let correctMessage = message?.last

    var allNames : String  = ""
    for namesString in allarray {
        if allNames.count > 0 {
            allNames += ", "
        }
        let name = String(namesString)
        allNames += name.slice(from: "@[", to: "]") ?? ""
    }
    if allNames.count > 0 {
        allNames += correctMessage ?? ""
    }
    print("Name and Message --- > \(allNames)")

Нарезка строки с использованием расширения строки

extension String {

    func slice(from: String, to: String) -> String? {

        return (range(of: from)?.upperBound).flatMap { substringFrom in
            (range(of: to, range: substringFrom..<endIndex)?.lowerBound).map { substringTo in
                substring(with: substringFrom..<substringTo)
            }
        }
    }
}

Я напечатал вывод, как показано ниже:

Имя и сообщение ---> Хема, Илеш П, Льюис Мерфи, как ты?

0 голосов
/ 30 апреля 2018

Эй, я столкнулся с аналогичным требованием. Вот как я справился.

Я создал расширение для String

extension String {
    /// Returns range of text in the string
    func getRange(OfText text: String) -> NSRange {
        let nsRepresentation = self as NSString
        return nsRepresentation.range(of: text)
    }
} 

В вашем контроллере вида,

var tapPrivacyGesture = UITapGestureRecognizer()
@IBOutlet weak var yourLabel: UILabel!
var displayText = String()

func matchesForRegexInText(regex: String, text: String, firstBracket: String, lastBracket: String) -> [String] {
    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        let results = regex.matches(
            in: text,
            options: [],
            range: NSRange(location: 0, length: nsString.length))
        return results.map { nsString.substring(with: $0.range) }.map { $0.replacingOccurrences(of: firstBracket, with: "") }.map { $0.replacingOccurrences(of: lastBracket, with: "") }
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

var givenString = "@[Hema](hema_ramburuth), @[Ilesh P](ilesh.panchal), @[Lewis Murphy](lewis) how are you?"
let nameStrings = matchesForRegexInText(regex: "\\[(.*?)\\]", text: givenString, firstBracket: "[", lastBracket: "]")
let removeForUIStrings = matchesForRegexInText(regex: "\\((.*?)\\)", text: givenString, firstBracket: "(", lastBracket: ")")

removeForUIStrings.forEach {
    givenString = givenString.replacingOccurrences(of: "(\($0))", with: "")
}
nameStrings.forEach {
    givenString = givenString.replacingOccurrences(of: "[\($0)]", with: $0)
}
givenString = givenString.replacingOccurrences(of: "@", with: "")
print(givenString)
displayText = givenString

tapPrivacyGesture.addTarget(self, action: #selector(self.handlePolicyTap(tap:)))
yourLabel.addGestureRecognizer(tapPrivacyGesture)
yourLabel.isUserInteractionEnabled = true


func handlePolicyTap(tap: UITapGestureRecognizer) {
    let storage = NSTextStorage(attributedString: yourLabel.attributedText ?? NSAttributedString())
    let layoutManager = NSLayoutManager()
    storage.addLayoutManager(layoutManager)

    let textContainer = NSTextContainer(size: CGSize(width: yourLabel.frame.size.width, height: yourLabel.frame.size.height+100))
    textContainer.lineFragmentPadding = 0.0
    textContainer.lineBreakMode = (yourLabel.lineBreakMode)
    textContainer.maximumNumberOfLines = yourLabel.numberOfLines
    layoutManager.addTextContainer(textContainer)

    let location: CGPoint = tap.location(in: yourLabel)
    let characterIndex: Int = layoutManager.characterIndex(for: location, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    guard
        characterIndex < storage.length,
        let question = currentQuestion else {
            return
    }
    nameStrings.forEach {
        let range = displayText.getRange(OfText: $0)
        if range.contains(characterIndex) {
            /// Perform actions on click of this string
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...