使用字符分隔符在Swift中查找和突出显示文本

我以前开发了一个android应用程序,作为用户的参考指南。 它使用了一个sqlite数据库来存储信息。 数据库存储没有格式的UTF-8文本(即粗体或下划线)

为了突出显示需要格式化的文本部分,我特别使用分隔符标记来包围它们,因为这不会作为信息出现在数据库中。 在向用户显示文本之前,我编写了一个方法来查找这些分隔符,并为其中包含的文本添加格式并删除分隔符。 所以$$ foo $$变成了foo

我的Java代码如下所示:

private static CharSequence boldUnderlineText(CharSequence text, String token) { int tokenLen = token.length(); int start = text.toString().indexOf(token) + tokenLen; int end = text.toString().indexOf(token, start); while (start > -1 && end > -1) { SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(text); //add the formatting required spannableStringBuilder.setSpan(new UnderlineSpan(), start, end, 0); spannableStringBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, 0); // Delete the tokens before and after the span spannableStringBuilder.delete(end, end + tokenLen); spannableStringBuilder.delete(start - tokenLen, start); text = spannableStringBuilder; start = text.toString().indexOf(token, end - tokenLen - tokenLen) + tokenLen; end = text.toString().indexOf(token, start); } return text; } 

我已经在Swift for iOS中重新创build了我的应用程序,除了显示正确的格式之外,它是完整的。 看来,Swift把string与其他语言不同。

到目前为止,我已经尝试对原始的无格式段落使用NSString和Stringtypes,并设法得到第一个分隔符的范围,开始和结束索引:

 func applyFormatting2(noFormatString: NSString, delimiter: String){ let paragraphLength: Int = noFormatString.length //length of paragraph let tokenLength: Int = delimiter.characters.count //length of token let rangeOfToken = noFormatString.rangeOfString(formatToken) //range of the first delimiter let startOfToken = rangeOfToken.toRange()?.startIndex //start index of first delimiter let endOfToken = rangeOfToken.toRange()?.endIndex //end index of first delimiter var startOfFormatting = endOfToken //where to start the edit (end index of first delimiter) } 

要么

 func applyFormatting(noFormatString: String, token: String){ let paragraphLength: Int = noFormatString.characters.count let tokenLength: Int = token.characters.count //length of the $$ Token (2) let rangeOfToken = noFormatString.rangeOfString(formatToken) //The range of the first instance of $$ in the no format string let startOfToken = rangeOfToken?.startIndex //the starting index of the found range for the found instance of $$ let endOfToken = rangeOfToken?.endIndex //the starting index of the found range for the found instance of $$ var startOfFormatting = endOfToken } 

我感谢这个代码是冗长的,并有无意义的variables,但它帮助我认为,当我正在解决一个问题时,我的代码。

我目前正在努力锻炼如何find第二/closures分隔符。 我想通过特定索引searchstring,就像我在Java中使用该行一样

 int end = text.toString().indexOf(token, start); 

但我不能解决如何使用范围做到这一点。

任何人都可以帮助我如何正确识别结束分隔符的位置或如何完成代码块来格式化所有必需的文本?

谢谢

阿尔

如何使用NSRegularExpression?

 public extension NSMutableAttributedString { func addAttributes(attrs: [String : AnyObject], delimiter: String) throws { let escaped = NSRegularExpression.escapedPatternForString(delimiter) let regex = try NSRegularExpression(pattern:"\(escaped)(.*?)\(escaped)", options: []) var offset = 0 regex.enumerateMatchesInString(string, options: [], range: NSRange(location: 0, length: string.characters.count)) { (result, flags, stop) -> Void in guard let result = result else { return } let range = NSRange(location: result.range.location + offset, length: result.range.length) self.addAttributes(attrs, range: range) let replacement = regex.replacementStringForResult(result, inString: self.string, offset: offset, template: "$1") self.replaceCharactersInRange(range, withString: replacement) offset -= (2 * delimiter.characters.count) } } } 

这是你怎么称呼它。

 let string = NSMutableAttributedString(string:"Here is some $$bold$$ text that should be $$emphasized$$") let attributes = [NSFontAttributeName: UIFont.boldSystemFontOfSize(15)] try! string.addAttributes(attributes, delimiter: "$$") 

iOS的做法是用NS[Mutable]AttributedString s。 您在文本范围上设置属性的字典。 这些属性包括字体重量,尺寸,颜色,行间距等