2016-10-18 8 views
2

Я не могу придумать функцию для удаления повторяющейся подстроки из моей строки. Моя строка выглядит следующим образом:Удалить повторяющуюся подстроку из строки

"<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)?

+0

Что вы хотите от строки? –

+0

Отредактировано оригинальное сообщение с ожидаемым выходом. –

+0

Первый и первый

ответ

1

Я написал решение, использующее регулярное выражение, с предположением, что теги не будут отображаться в вложенном содержимом более 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>. 
1

Попробуйте это, я только что сделал. Надеюсь, это полезно.

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: "") 
+0

Ну, GJ, но я не думаю, что это безопасно. Потому что иногда удаление rep. подводные лодки. дисбаланс HTML. Для Ex: ' х б' ваших результатов алгоритма ' х б', который является несбалансированным. – ferit