You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:35:47