我有一个名为source
的字符串。此字符串包含标记,在左侧和右侧标有数字符号(#)。
从源字符串中获取标记名称的最有效方法是什么。 源字符串:
let source = "Here is tag 1: ##TAG_1##, tag 2: ##TAG_2##."
预期结果:
["TAG_1", "TAG_2"]
答案 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知识。 请记住,如果这不编译,那么您可能需要稍微调整代码,因为我没有开发环境我可以在发布之前测试它。