向字符串添加文本

时间:2018-08-06 17:12:41

标签: swift parsing markdown

我正在对一些动态Markdown进行样式设置,但是我用于样式设置的框架不支持链接的嵌套标签。

我需要解析字符串并有效地关闭样式markdown标签:

db.items.aggregate([
  { $match: {} },
  { $group: {
         _id: '$category',
         sumQ: {$sum: '$quantity'}
      } 
  },
  { $sort: {sumQ: -1 } },
  { $limit: 1 }
])

对此:

    "__Some bold text [FIRST LINK](https://FIRSTLINK.COM \"FIRST LINK\"), more bold text.__\n\n additional text \n\n
 *some italic text[SECOND LINK](https://SECONDLINK.COM) ending text,*"

这仅适用于粗体和斜体文本。我开始沿着

的路线走
    "__Some bold text __[FIRST LINK](https://FIRSTLINK.COM \"FIRST LINK\")__, more bold text.__\n\n additional text \n\n
 *some italic text*[SECOND LINK](https://SECONDLINK.COM)* ending text,*"

但是想知道,在Swift中还有更好的方法吗?

编辑-为清楚起见-本质上,我需要修改现有字符串以在链接标签之前关闭标签,并在链接标签之后重新打开-这样可以防止链接与样式标签嵌套在一起,并允许样式设置器框架相应地应用属性字符串

编辑---与@Linus评论一致,这里是正则表达式的结果(请注意,将这些扩展名放在扩展程序的外部以使其能够在操场上进行测试

var str = "__Some bold text [FIRST LINK](https://FIRSTLINK.COM \"FIRST LINK\"), more bold text.__\n\n additional text \n\n *some italic text[SECOND LINK](https://SECONDLINK.COM) ending text,*"

    let bold = str.components(separatedBy: "__")
    for var string in bold {
        if let matchedIndex = string.index(of: "[") {
            string.insert(contentsOf: "__", at: matchedIndex)
        }
    }

打印结果

var str = "__Some bold text [FIRST LINK](https://FIRSTLINK.COM \"FIRST LINK\"), more bold text.__\n additional text \n *some italic text[SECOND LINK](https://SECONDLINK.COM) ending text,*\n__sfdadhfjkh [THIRD LINK](https://THIRDLINK.COM \"THIRD LINK\"), more bold text.__"

do {
    var regex = try NSRegularExpression(pattern:  "(\\[.*?\\))" , options: [.caseInsensitive])
    var newString = regex.stringByReplacingMatches(in: str, options: [], range: NSMakeRange(0, str.utf16.count), withTemplate: "__$1__")
    print("\nFirst regex  __$1__  \n\n\(newString)")

    regex = try NSRegularExpression(pattern:  "(\\[.*?\\))" , options: [.caseInsensitive])
        var newerString = regex.stringByReplacingMatches(in: str, options: [], range: NSMakeRange(0, str.utf16.count), withTemplate: "*$1*")
        print("\nSecond Regex *$1* \n\n"+newerString)
} catch { print("ERROR: searchFor regex (\("(\\[.*?\\))")) on string (\(str)) failed") }

我需要在同一字符串上同时修改斜体和强标签,以便将其传递给要设置样式的视图

1 个答案:

答案 0 :(得分:1)

我正在使用以下String扩展名,该扩展名使您可以查找与某个正则表达式模式匹配的字符串,并将其替换为其他字符串:

extension String {
    mutating func replaceOccurrence(ofPattern pattern: String, with replacementString: String) {
        do {
            let regex = try NSRegularExpression(pattern: pattern, options: [.caseInsensitive])
            self = regex.stringByReplacingMatches(in: self, options: [], range: NSMakeRange(0, utf16.count), withTemplate: replacementString)
        } catch { print("ERROR: searchFor regex (\(pattern)) on string (\(self)) failed") }
    }
}

然后,您可以将(\[.*?\))替换为__$1__,如下所示:

str.replaceOccurrence(ofPattern: "(\\[.*?\\))", with: "__$1__")

说明

...如果您不熟悉regular expressions

正则表达式:

(-打开括号,创建一个新组,该组随后用于将匹配的字符串重新插入替换字符串中
\[-匹配一个括号;需要使用\进行转义以禁用括号的正则表达式含义并改为匹配实际字符
.*-匹配任何字符...
?-...直到...
\)-...下一个右括号;还需要转义此字符以匹配实际角色,而不是创建新的组
)-关闭群组

替换:

__-您的替换字符串:在这种情况下打开粗体范围
$1-在此处插入先前匹配的组 __-同样,您的替换字符串:在这种情况下,关闭粗体范围

事实:在Swift中,您需要转义转义的字符,例如\\,以确保代码能够编译,因为Xcode认为,您正在尝试从中转义字符编译时的字符串。
这就是正则表达式不是(\[.*?\))而是(\\[.*?\\))的原因。