字符串

时间:2015-06-11 15:35:00

标签: ios string performance

我目前正在使用以下字符串扩展来获取大字符串中特定字符串的索引:

func indexOf(target: String, startIndex: Int) -> Int
{
    var startRange = advance(self.startIndex, startIndex)
    var range = self.rangeOfString(target, options: NSStringCompareOptions.LiteralSearch, range: Range<String.Index>(start: startRange, end: self.endIndex))
    if let range = range {
        return distance(self.startIndex, range.startIndex)
    } else {
        return -1
    }
}

我多次打电话给我,我遇到了性能问题。 有没有人知道如何更快地执行indexOf()? 目前我正在迅速做到这一点。在Objective-C和桥接中这样做会提供更好的性能吗?或者可能包括任何C代码?有什么想法吗?

更新有关背景的更多信息

  • 我有一个很长的文字,比如5000个字符。
  • 文本除了普通文本外还包含多个元数据标签。这些标签就像{{blabl {{sdasdg}} abla}}; [[bla bla | blabla]]; {| BLA |}。
  • 我想删除它们或以特定方式格式化它们。
  • 我不能使用正则表达式,因为正则表达式不支持堆叠表达式({{{{{{{{{{{{{{{{{{{{{}}}}}}}

所以我编写了自己的函数,但是效果很慢。

我实际上在做的是我完成文本,而我只是在寻找这些标签。为此我需要一个如下所示的基本函数来确定哪个标签是第一个以及哪个位置。当我找到一个标签时,我将转到下一个,依此类推。我认识到,这是我最耗时的一部分。当然,我也称这个也是很多时间。

func getStart(sText:String, alSearchPatterns:[String], ifrom:Int) -> (Pattern:String, index:Int) {

    var bweiter:Bool=true;

    var actualcharacter:Character;

    var returnPattern="";
    var returnIndex = -1;
    println("ifrom : " + String(ifrom));

    var indexfound:Int = -1;
            // finde ersten character der Patterns
            var bsuchepattern=true;

            for(var i=0;i<alSearchPatterns.count && bsuchepattern;i++){

                let sPattern=alSearchPatterns[i];
                let pattern_first_char=sPattern[0];
                //let pattern_first_char=String(sPattern[0]);

                let characterIndex = sText.indexOfCharacter(pattern_first_char, fromIndex: ifrom); // find(sText, pattern_first_char);
                //let characterIndex = sText.indexOf(pattern_first_char, startIndex: ivon);

                if(characterIndex != -1){
                    if((indexfound == -1) || characterIndex < indexfound){
                        // found something that is first of all actually.
                        let patternlength=sPattern.length;
                        let substring_in_text=sText.substring(characterIndex, endIndex: characterIndex + patternlength);
                        if(substring_in_text.equals(sPattern)){
                            returnPattern=sPattern;
                            returnIndex=characterIndex;
                        }
                    }
                }
            }

        return (returnPattern,returnIndex);
}

任何提示如何更好地执行此操作或任何有关如何更好地执行此操作的提示。

0 个答案:

没有答案