java - Java Regex 仅替换部分字符串(url)
问题描述
我只想替换字符串的数字部分。大多数情况下,它要么是完整的 URL,要么是 URL 的一部分,但它也可以只是一个普通的字符串。
/users/12345
变成/users/XXXXX
/users/234567/summary
变成/users/XXXXXX/summary
/api/v1/summary/5678
变成/api/v1/summary/XXXX
http://example.com/api/v1/summary/5678/single
变成http://example.com/api/v1/summary/XXXX/single
请注意,我不是1
从/api/v1
到目前为止,我只有以下在大多数情况下似乎有效的方法:
input.replaceAll("/[\\d]+$", "/XXXXX").replaceAll("/[\\d]+/", "/XXXXX/");
但这有两个问题:
- 替换大小与原始字符串长度不匹配。
- 替换字符是硬编码的。
有一个更好的方法吗?
解决方案
在 Java 中,您可以使用:
str = str.replaceAll("(/|(?!^)\\G)\\d(?=\\d*(?:/|$))", "$1X");
正则表达式详细信息:
\G
在前一个匹配的结尾或第一个匹配的字符串的开头断言位置。(/|(?!^)\\G)
:/
捕获组 #1 中上一场比赛的比赛或结束(但不是在开始时)\\d
: 匹配一个数字(?=\\d*(?:/|$))
:确保数字后跟一个/
或结束。- 替换:
$1X
: 用捕获组 #1 替换它,然后X
推荐阅读
- sql - 将未来密码值更改一个字母
- android - Android - MPAndroidChart 库 - 在显示多个图表时设置 LegendEntry
- r - 重新排列 data.frame 的行名(非字母)
- javascript - PIXIJS eventSystem 在 V6.0.2 中找不到
- swift - 哪个委托方法在后台或终止状态下接收 Firebase 推送通知有效负载?
- docker - 如何在没有 Confluent-Hub 的情况下安装 Debezium mysql 或其他 kafka 连接器
- visual-studio-code - VS Code - 找不到命令“emmet.expandAbbreviation”
- flutter - 尝试用不同的表达式替换对实例成员的引用
- axon - 使用 Axon Server 在订阅查询旁边处理查询
- mysql - NetBeans 未显示所有 MySQL 数据库