如何使用正则表达式从字符串中提取第 n 个 URL?

Posted

技术标签:

【中文标题】如何使用正则表达式从字符串中提取第 n 个 URL?【英文标题】:How to extract nth URL from string using regex? 【发布时间】:2021-05-06 19:31:26 【问题描述】:

我想使用正则表达式提取第二个 URL,我不能使用任何其他东西,到目前为止,我已经设法使用正则表达式从字符串中提取所有 URL,但它只是给出了第一个 URL。

fun main() 
    var text = "hello world https://www.google.com hello world https://www.***.com hello world https://www.test.com"
    var regex = """((http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?)"""
    println(performRegex(text, regex))


private fun performRegex(text: String?, regex: String?): String? 
    val regexPattern = Regex("""$regex""")
    return regexPattern.find(text.toString())?.value

电流输出:https://www.google.com

预期输出:https://www.***.com

【问题讨论】:

尝试使用 findAll 并获取第二项。 不改代码就可以了。该代码仅用于演示。它只需要使用正则表达式来处理 【参考方案1】:

你可以使用

private fun performRegex(text: String?, regex: String?): String? 
    val regexPattern = Regex("""$regex""")
    val matchList = regexPattern.findAll(text.toString()).mapit.value.toList() 
    return if (matchList.size >= 2) matchList[1] else null


fun main(args: Array<String>) 
    var text = "hello world https://www.google.com hello world https://www.***.com hello world https://w...content-available-to-author-only...t.com"
    var regex = """(?:https?|ftp)://\S+"""
    println(performRegex(text, regex))

请参阅online Kotlin demo。

正则表达式是(?:https?|ftp)://\S+,它匹配http://https://ftp://,然后是任何一个或多个非空白字符。

val matchList = regexPattern.findAll(text.toString()).mapit.value.toList() 部分查找所有匹配项并将结果映射到字符串列表。

如果匹配列表大小为两个或更多,return if (matchList.size &gt;= 2) matchList[1] else null 部分返回找到的第二个匹配项,否则返回null

【讨论】:

代码仅供演示。我无法更改代码。它只需要使用正则表达式来处理 @VaibhavChopade 您将不得不修改代码,因为正则表达式是一个定义规则的字符串,匹配什么。搜索多少匹配是代码责任。 (?:http|ftp)s?://\S++.*?((?:http|ftp)s?://\S+)can work for you,但您仍然需要获取第 1 组的值。 @VaibhavChopade 当然,我已经展示了。或this way,正则表达式定义为var regex = """(?:http|ftp)s?://\S++.*?((?:http|ftp)s?://\S+)""",return 语句必须为return regexPattern.find(text.toString())?.groupValues?.getOrNull(1) 嗨@Wiktor,有没有办法只输出第二场比赛?我之前已经尝试过您的方法,但它会在两个 URL 之间输出整个文本... @VaibhavChopade 我目前的解决方案就是如何获得第 N 场比赛。第二个。你不能用纯 Java 正则表达式得到它,你必须编辑你的代码。就是这样。

以上是关于如何使用正则表达式从字符串中提取第 n 个 URL?的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从 URL 中提取***域和二级域

Google表格正则提取第n个日期字符串

从字符串中提取分数、小数和数字的正则表达式[关闭]

正则表达式 - 从字符串中提取第二个位置数字

使用 Java + 正则表达式从文本文档中提取 URL

如何在Google表格中获取某些值后如何进行正则表达式提取