Swift正则匹配问题:如何排除##以识别单个#开头的Markdown标题
解决方法
你可以通过两种方式修正这个问题:
方法一:用字符串原生方法(更直观高效)
直接通过hasPrefix判断,先检查是否以单个#开头,同时排除以##开头的情况:
let strings = ["# Fancy Title", "## Fancy Subtitle", "Body Content"] for string in strings { if string.hasPrefix("#") && !string.hasPrefix("##") { // 解析一级标题 print("一级标题:\(string)") } else if string.hasPrefix("##") { // 解析二级标题 print("二级标题:\(string)") } else { // 解析正文 print("正文:\(string)") } }
方法二:修正正则表达式
原来的正则/^#(^#)/逻辑错误,应该用负向先行断言确保#后面不是另一个#,正则写成/^#(?!#)/:
let strings = ["# Fancy Title", "## Fancy Subtitle", "Body Content"] for string in strings { if string.contains(/^#(?!#)/) { // 解析一级标题 print("一级标题:\(string)") } else if string.contains(/^##/) { // 解析二级标题 print("二级标题:\(string)") } else { // 解析正文 print("正文:\(string)") } }
两种方法都能准确区分一级标题、二级标题和正文,其中方法一不用正则,代码可读性更高,推荐使用。
内容的提问来源于stack exchange,提问作者appfrosch
相关产品推荐
相关产品推荐

