java - 是否可以使用 Kotlin/Java(包括(或不包括)端口)创建一个正则表达式来删除整个域(没有子域)?
问题描述
我在许多帖子中寻找可能的答案,但似乎都没有解决我的问题
我基本上会有一个我不知道它是如何的 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....
解决方案
在纯 Java 中,您可以尝试以下正则表达式:(?i)(?:[a-z]+://)?(?:[^/]+)(/.*)?
- 第一个
(?i)
将使其不区分大小写 - 第二部分 (
(?:[a-z]+://)?
) 将匹配非捕获组中的可选协议 - 第三部分 (
(?:[^/]+)
) 将匹配直到下一个斜杠的任何内容,即域和任何可选端口,也在非捕获组中 - 最后一部分 (
(/.*)?
) 将以斜杠(如果存在)开头的任何内容捕获到捕获组中 - 这就是您要保留的组
编辑:
看来我错过了您也想保留子域。尝试以下调整后的查询:
(?i)^(?:[a-z]+://)?(?:www\.)?(.*?)(?:\.[^./]+){2}(/.*)?$
变化:
- 我添加
^...$
以匹配下一部分所需的整个字符串 - 如果存在,协议部分
(?:www\.)?
将匹配www.
- 之后
(.*?)
将匹配子域(如果存在) - 域部分已更改
(?:[^/]+)
为(?:\.[^./]+){2}
现在匹配点的任何序列,后跟除点或斜线之外的任何序列,并且重复 2 次。那将匹配google.com
,.google.com
等google.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 可能会更好/更容易。
推荐阅读
- java - 为什么 List.contains(Object) 的行为不同?
- r - 如何在同一个数据帧上做colsum和average
- powerbi - 使用 DAX 生成日期系列
- javascript - 仅在服务器上需要一个包
- java - Intellij IDEA 仅针对所有未提交的更改运行测试
- regex - 在换行符之前匹配字符,不包括空格?
- macos - MacOS - 使用带有launchd的脚本 - 启动,登录,注销,关闭?
- service-worker - Workbox 的服务人员在更改时未更新
- python - AllenNLP 共指分辨率的多 GPU 训练
- reactjs - 事件处理程序中带有 [name] 的 PrevState