从字符串中删除重复的子字符串

Remove repeating substring from string

我想不出从我的字符串中删除重复子字符串的函数。我的字符串如下所示:

"<bold><bold>Rutger</bold> Roger</bold> rented a <bold>testitem zero dollars</bold> from <bold>Rutger</bold>."

如果 <bold> 后面跟着另一个 <bold>,我想删除第二个 <bold>。删除第二个 <bold> 时,我还想删除后面的第一个 </bold>

所以我正在寻找的输出应该是这样的:

"<bold>Rutger Roger</bold> rented a <bold>testitem zero dollars</bold> from <bold>Rutger</bold>."

有人知道如何在 Swift (2.2) 中实现吗?

试试这个,我刚做的。希望这对您有所帮助。

class Test : NSObject {
    static func removeFirstString (originString: String, removeString: String, withString: String) -> String {
        var genString = originString
        if originString.contains(removeString) {
            let range = originString.range(of: removeString)
            genString = genString.replacingOccurrences(of: removeString, with: withString, options: String.CompareOptions.anchored, range: range)
        }
        return genString
    }
}

var newString = Test.removeFirstString(originString: str, removeString: "<bold>", withString: "")

newString =  Test.removeFirstString(originString: newString, removeString: "</bold>", withString: "")

我使用正则表达式编写了一个解决方案,假设标签不会在嵌套内容中出现超过 1 次。换句话说,它只是清理双标签而已。您可以使用相同的代码和递归调用来清除任意数量的嵌套重复标记:

class Cleaner {

    var tags:Array<String> = [];

    init(tags:Array<String>) {
        self.tags = tags;
    }

    func cleanString(html:String) -> String {

        var res = html

        do {

            for tag in tags {

                let start = "<\(tag)>"
                let end = "</\(tag)>"

                let pattern = "\(start)(.*?)\(end)"

                let regex = try NSRegularExpression(pattern: pattern, options: NSRegularExpression.Options.caseInsensitive)

                let matches = regex.matches(in: res, options: [], range: NSRange(location: 0, length: res.utf16.count))

                var diff = 0;
                for match in matches {

                    let outer_range = NSMakeRange(match.rangeAt(0).location - diff, match.rangeAt(0).length)
                    let inner_range = NSMakeRange(match.rangeAt(1).location - diff, match.rangeAt(1).length)
                    let node = (res as NSString).substring(with: outer_range)
                    let content = (res as NSString).substring(with: inner_range)

                    // look for the starting tag in the content of the node
                    if content.range(of: start) != nil {
                        res = (res as NSString).replacingCharacters(in: outer_range, with: content);

                        //for shifting future ranges
                        diff += (node.utf16.count - content.utf16.count)
                    }
                }
            }
        }
        catch {
            print("regex was bad!")
        }

        return res
    }
}

let cleaner = Cleaner(tags: ["bold"]);
let html = "<bold><bold>Rutger</bold> Roger</bold> rented a <bold><bold>testitem</bold> zero dollars</bold> from <bold>Rutger</bold>."

let cleaned = cleaner.cleanString(html: html)
print(cleaned)
//<bold>Rutger Roger</bold> rented a <bold>testitem zero dollars</bold> from <bold>Rutger</bold>.