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

Swift正则提取a href纯链接:适配=前后含空格场景需求

提取HTML中href属性的纯链接正则问题

我原本用以下正则提取字符串里的href='link'完整片段:

"href\\s*=\\s*[\"']([^\"']*)[\"']"

但我只想提取其中的纯链接内容,不想包含href=和引号这些部分。我尝试了下面的正则表达式和Swift代码,却无法生效:

let input = "Some text with a <a href=\"http://example.com\">link</a>."
let pattern = "(?<=href\\s*=\\s*[\"'])[^\"']*(?=[\"'])"

if let range = input.range(of: pattern, options: .regularExpression) {
    let url = String(input[range])
    print("Found link: \(url)")
} else {
    print("No link found")
}

我原本设计这个正则的逻辑是:

  • (?<=href\s*=\s*['&quot;]):正向后行断言,检查是否存在href=及前后任意空白字符,再加上单/双引号,确保只匹配以href开头且带引号的链接
  • [^'&quot;]*:匹配任意数量非单/双引号的字符,也就是实际的链接内容
  • (?=['&quot;]):正向前行断言,检查链接后面是否紧跟单/双引号,确保只匹配链接本身

更新:
后来我找到了一个能正常工作的正则,但没法修改它来适配=前后有空格的情况(比如"href = 'link'"):

(?&lt;=href\\=['\&quot;]).*?(?=['\&quot;])

解决方法

要适配=前后的空格,只需要在正向后行断言里的href与=之间、=与引号之间加上\s*(匹配任意数量的空白字符,包括0个)即可。修正后的正则如下:

(?<=href\s*=\s*['"]).*?(?=['"])

在Swift代码中,反斜杠需要转义,所以实际使用的pattern字符串应该是:

let pattern = "(?<=href\\s*=\\s*['\\\"]).*?(?=['\\\"])"

正则逻辑说明

  • (?<=href\s*=\s*['"]):正向后行断言,允许href和=之间、=和引号之间存在任意空格(包括没有空格的情况)
  • .*?:非贪婪模式匹配任意字符,直到遇到最近的单/双引号,避免一次性匹配多个链接的内容
  • (?=['"]):正向前行断言,确保链接的结尾紧跟单/双引号,保证匹配的是完整的链接内容

测试代码

如果只提取第一个匹配的链接:

let input = "Some text with a &lt;a href = \&quot;http://example.com\&quot;&gt;link&lt;/a&gt;."
let pattern = "(?<=href\\s*=\\s*['\\\"]).*?(?=['\\\"])"

if let range = input.range(of: pattern, options: .regularExpression) {
    let url = String(input[range])
    print("Found link: \(url)")
} else {
    print("No link found")
}

执行后会输出:Found link: http://example.com

如果需要提取所有匹配的链接,可以使用NSRegularExpression遍历结果:

let input = "Some text with a &lt;a href = \&quot;http://example.com\&quot;&gt;link&lt;/a&gt; and another &lt;a href='http://test.org'&gt;test&lt;/a&gt;."
let pattern = "(?<=href\\s*=\\s*['\\\"]).*?(?=['\\\"])"

do {
    let regex = try NSRegularExpression(pattern: pattern)
    let results = regex.matches(in: input, range: NSRange(input.startIndex..., in: input))
    for result in results {
        if let range = Range(result.range, in: input) {
            let url = String(input[range])
            print("Found link: \(url)")
        }
    }
} catch {
    print("Invalid regex: \(error.localizedDescription)")
}

执行后会输出:

Found link: http://example.com
Found link: http://test.org

内容的提问来源于stack exchange,提问作者Peter Lapisu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 15:44:54