NSRegularExpression中如何用负正则排除**包裹的内容?
如何用正则排除**包裹的内容,提取剩余文本?
当然可以做到!不过你之前尝试的正则写法有点问题,因为那种前瞻匹配会逐字符判断,没法准确跳过整个**words**块。我给你两种解决方案:一种是直接替换掉加粗内容(最实用),另一种是用正则匹配所有非加粗部分,满足你要的"负正则"需求。
方案1:直接替换(最简单高效)
如果你的目标只是得到The brown ...这种结果,直接把所有**...**格式的内容替换为空就好,代码非常简洁:
let str = "The **quick** brown **fox** ..." // 匹配所有**包裹的内容(和你原正则的匹配范围一致,支持单词和空格) let boldPattern = "\\*{2}[\\w ]+\\*{2}" let cleanedStr = str.replacingOccurrences(of: boldPattern, with: "", options: .regularExpression) // 可选:去掉替换后可能出现的多余空格 let finalStr = cleanedStr.replacingOccurrences(of: "\\s+", with: " ", options: .regularExpression).trimmingCharacters(in: .whitespacesAndNewlines) print(finalStr) // 输出:"The brown ..."
方案2:匹配所有非加粗内容(负正则思路)
如果你需要单独提取每一段非加粗的文本片段再拼接,可以用这个正则精准匹配所有不被**包裹的内容:
let str = "The **quick** brown **fox** ..." // 匹配所有非**包裹的内容 let nonBoldPattern = "(?:^|\\*\\*)(?!\\*\\*)(?:(?!\\*\\*).)+(?=\\*\\*|$)" guard let regex = try? NSRegularExpression(pattern: nonBoldPattern) else { print("正则表达式初始化失败") return } let results = regex.matches(in: str, range: NSRange(str.startIndex..., in: str)) // 把所有匹配到的非加粗片段拼接成完整文本 let nonBoldText = results.map { String(str[Range($0.range, in: str)!]) }.joined() print(nonBoldText) // 输出:"The brown ..."
这个正则的含义拆解:
(?:^|\*\*):匹配字符串开头,或者一段加粗内容的结束位置(用非捕获组避免多余分组)(?!\*\*):确保当前位置后面不是**,避免误匹配到加粗标记本身(?:(?!\*\*).)+:逐字符匹配,直到遇到**或者字符串结尾(确保不会进入加粗块)(?=\*\*|$):正向断言,确保当前片段的后面是**或者字符串结束
为什么你之前的正则没生效?
你尝试的((?!\\*{2}([\\w ]+)\\*{2}).*)问题在于,这个前瞻是检查整个后续内容是否不存在**...**,而不是跳过单个加粗块。所以它只会匹配到第一个**之前的文本,后面的内容因为存在加粗块,就不会被匹配到了,自然达不到预期效果。
内容的提问来源于stack exchange,提问作者Ivan Cantarino
相关产品推荐
相关产品推荐

