首页 > 解决方案 > 是否可以使用 Kotlin/Java(包括(或不包括)端口)创建一个正则表达式来删除整个域(没有子域)?

问题描述

我在许多帖子中寻找可能的答案,但似乎都没有解决我的问题

如何通过正则表达式删除 URL 的某些部分?

从 url 中删除域的最佳方法

从 url 中删除域的最佳方法

在 Java 中,如何提取 URL 的域?

我基本上会有一个我不知道它是如何的 URL。像:

https://somevalue.google.com/something

或者

www.somevalue.google.com/something

或者

somevalue.localhost:8080/something

我基本上只需要使用 http(s)、www、.com 或 :8080 删除域(而不是子域),但似乎比预期的要困难。

我试过这个正则表达式

"^(http[s]?://www\\.|http[s]?://|www\\.)"

我能够删除 http、https 和/或 www

从那时起,我认为添加多个组合会更容易,例如添加

[\w] or `[?:*]` but seems like is not getting a proper match.

我基于此文档http://zetcode.com/kotlin/regularexpressions/解释了每种模式的含义,但没有成功。

知道我做错了什么吗?

我也不想乘坐子域somevalue

所以,从

https://somevalue.google.com/something...

得到类似的东西

somevalue/something....

标签: javaregexkotlin

解决方案


在纯 Java 中,您可以尝试以下正则表达式:(?i)(?:[a-z]+://)?(?:[^/]+)(/.*)?

  • 第一个(?i)将使其不区分大小写
  • 第二部分 ( (?:[a-z]+://)?) 将匹配非捕获组中的可选协议
  • 第三部分 ( (?:[^/]+)) 将匹配直到下一个斜杠的任何内容,即域和任何可选端口,也在非捕获组中
  • 最后一部分 ( (/.*)?) 将以斜杠(如果存在)开头的任何内容捕获到捕获组中 - 这就是您要保留的组

编辑:

看来我错过了您也想保留子域。尝试以下调整后的查询:
(?i)^(?:[a-z]+://)?(?:www\.)?(.*?)(?:\.[^./]+){2}(/.*)?$

变化:

  • 我添加^...$以匹配下一部分所需的整个字符串
  • 如果存在,协议部分(?:www\.)?将匹配www.
  • 之后(.*?)将匹配子域(如果存在)
  • 域部分已更改(?:[^/]+)(?:\.[^./]+){2}现在匹配点的任何序列,后跟除点或斜线之外的任何序列,并且重复 2 次。那将匹配google.com,.google.comgoogle.com:1234

somevalue/something...要从您那里获取信息,https://www.somevalue.google.com:1234/something...请在 Java 中使用以下代码:

String regex = "(?i)^(?:[a-z]+://)?(?:www\\.)?(.*?)(?:\\.[^./]+){2}(/.*)?$";
String replaced = "https://www.somevalue.google.com:1234/something...".replaceAll(regex, "$1$2");

请注意,这可能仍然不符合您的所有要求(我们并不确切知道),因此请记住,如果它们变得更复杂,则正确使用解析 url 可能会更好/更容易。


推荐阅读