2016-10-18 27 views
2

文字列から繰り返し部分文字列を削除する関数はありません。私の文字列は次のようになります。文字列から繰り返し部分文字列を削除します。

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

そして<bold>が、私は二<bold>を削除する別の<bold>が続いている場合。その2番目を取り除くときには、を削除します。

だから、私が探している出力はこのようになりますスウィフト(2.2)でこれを達成するためにどのように誰もが知っている

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

+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を削除するので。 subs。 HTMLのアンバランス。例の場合: 'アンバランスである X B'あなたのアルゴリズムの結果 ' X B'。 – ferit

関連する問題