我正在对一些动态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") }
我需要在同一字符串上同时修改斜体和强标签,以便将其传递给要设置样式的视图
答案 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认为,您正在尝试从中转义字符编译时的字符串。
这就是正则表达式不是(\[.*?\))
而是(\\[.*?\\))
的原因。