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*['"]):正向后行断言,检查是否存在href=及前后任意空白字符,再加上单/双引号,确保只匹配以href开头且带引号的链接[^'"]*:匹配任意数量非单/双引号的字符,也就是实际的链接内容(?=['"]):正向前行断言,检查链接后面是否紧跟单/双引号,确保只匹配链接本身
更新:
后来我找到了一个能正常工作的正则,但没法修改它来适配=前后有空格的情况(比如"href = 'link'"):
(?<=href\\=['\"]).*?(?=['\"])
解决方法
要适配=前后的空格,只需要在正向后行断言里的href与=之间、=与引号之间加上\s*(匹配任意数量的空白字符,包括0个)即可。修正后的正则如下:
(?<=href\s*=\s*['"]).*?(?=['"])
在Swift代码中,反斜杠需要转义,所以实际使用的pattern字符串应该是:
let pattern = "(?<=href\\s*=\\s*['\\\"]).*?(?=['\\\"])"
正则逻辑说明
(?<=href\s*=\s*['"]):正向后行断言,允许href和=之间、=和引号之间存在任意空格(包括没有空格的情况).*?:非贪婪模式匹配任意字符,直到遇到最近的单/双引号,避免一次性匹配多个链接的内容(?=['"]):正向前行断言,确保链接的结尾紧跟单/双引号,保证匹配的是完整的链接内容
测试代码
如果只提取第一个匹配的链接:
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") }
执行后会输出:Found link: http://example.com
如果需要提取所有匹配的链接,可以使用NSRegularExpression遍历结果:
let input = "Some text with a <a href = \"http://example.com\">link</a> and another <a href='http://test.org'>test</a>." 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
相关产品推荐
相关产品推荐

