如何获取特定分隔符之间的所有字符串?

时间:2016-06-30 17:56:30

标签: ios swift

我有一个名为source的字符串。此字符串包含标记,在左侧和右侧标有数字符号()。

字符串中获取标记名称的最有效方法是什么。 源字符串:

let source = "Here is tag 1: ##TAG_1##, tag 2: ##TAG_2##."

预期结果:

["TAG_1", "TAG_2"]

3 个答案:

答案 0 :(得分:1)

不是一个非常简短的解决方案,但是你去了:

let tags = source.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: " ,."))
    .filter { (str) -> Bool in
        return str.hasSuffix("##") && str.hasPrefix("##")
    }
    .map { (str) -> String in
        return str.stringByReplacingOccurrencesOfString("##", withString: "")
    }

答案 1 :(得分:1)

##的所有出现时分割字符串:

let components = source.components(separatedBy: "##")
// Result: ["Here is tag 1: ", "TAG_1", ", tag 2: ", "TAG_2", "."]

检查是否有奇数个组件,否则奇数## s:

guard components.count % 2 == 1 else { fatalError("Unbalanced delimiters") }

获取每一个元素:

components.enumerated().filter{ $0.offset % 2 == 1 }.map{ $0.element }

在单一功能中:

import Foundation

func getTags(source: String, delimiter: String = "##") -> [String] {
    let components = source.components(separatedBy: delimiter)
    guard components.count % 2 == 1 else { fatalError("Unbalanced delimiters") }
    return components.enumerated().filter{ $0.offset % 2 == 1 }.map{ $0.element }
}

getTags(source: "Here is tag 1: ##TAG_1##, tag 2: ##TAG_2##.") // ["TAG_1", "TAG_2"]

答案 2 :(得分:0)

您可以阅读此信息并根据需要调整答案:Swift: Split a String into an array

如果不是,您也可以创建自己的方法,请记住字符串是一个字符数组,因此您可以使用循环来迭代并检查“#”

let strLength = source.characters.count;
var strEmpty = "";

for( var i=0; i < strLength; i++ )
{
   if( source[ i ] == '#' )
   {
     var j=(i+2);

     for( j; source[ (i+j) ] != '#'; j++ )
       strEmpty += source[ (i+j) ]; // concatenate the characters to another variable using the += operator

     i = j+2;
     // do what you need to with the tag
   }
}

我更像是一个C ++程序员,而不是Swift程序员,所以如果我不想使用标准方法,这就是我接近它的方法。可能有更好的方法,但我没有任何Swift知识。 请记住,如果这不编译,那么您可能需要稍微调整代码,因为我没有开发环境我可以在发布之前测试它。