正则表达式提取href url

时间:2017-04-24 15:11:29

标签: regex swift

我想从带有正则表达式的String中提取链接。我找到了类似的帖子here,我尝试了这段代码

let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>.*?</a>")
        let range = NSMakeRange(0, text.characters.count)
        let htmlLessString :String = regex.stringByReplacingMatches(in: text,
                                                                            options: [],
                                                                            range:range ,
                                                                            withTemplate: "")

但建议的正则表达式删除了href标记的所有内容。我的字符串看起来像

SOME stirng  <a href="https://com.mywebsite.com/yfgvh/f23/fsd" rel="DFGHJ"> some text I need to keep </a> and other text

,预期结果是

SOME stirng  https://com.mywebsite.com/yfgvh/f23/fsd some text I need to keep and other text

完美的结果是

SOME stirng some text I need to keep (https://com.mywebsite.com/yfgvh/f23/fsd) and other text

您是否有可能实现这一目标?

3 个答案:

答案 0 :(得分:3)

当然它会删除href内容,因为你是 ...用空字符串替换马达......

您的示例字符串与模式不匹配,因为缺少结束标记</a>

模式"<a[^>]+href=\"(.*?)\"[^>]*>"检查直到链接后的结束角括号。

捕获的组位于匹配的索引1处。此代码打印所有提取的链接:

let text = "<a href=\"https://com.mywebsite.com/yfgvh/f23/fsd\" rel=\"DFGHJ\">"

let regex = try! NSRegularExpression(pattern: "<a[^>]+href=\"(.*?)\"[^>]*>")
let range = NSMakeRange(0, text.characters.count)
let matches = regex.matches(in: text, range: range)
for match in matches {
    let htmlLessString = (text as NSString).substring(with: match.rangeAt(1))
    print(htmlLessString)
}

答案 1 :(得分:1)

我不是Swift的常规开发人员,但是,您是否尝试使用此withTemplate的{​​{1}}选项?

stringByReplacingMatches

答案 2 :(得分:0)

此正则表达式似乎适用于这种情况:href="(.*)" .*">(.*)<\/a>(.*),第1组将<a></a>之后的<a></a>和第3组文本之间的第2组文本放在一起,但是您必须使用此扩展程序可以从群组中获取信息,因为没有本机群组支持:http://samwize.com/2016/07/21/how-to-capture-multiple-groups-in-a-regex-with-swift/