【问题标题】:Java Regex to replace only part of string (url)Java Regex 仅替换部分字符串(url)
【发布时间】:2020-03-16 18:43:34
【问题描述】:

我只想替换字符串的数字部分。大多数情况下,它要么是完整的 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

请注意,我不会从 /api/v1 替换 1

到目前为止,我只有以下在大多数情况下似乎有效的方法:

input.replaceAll("/[\\d]+$", "/XXXXX").replaceAll("/[\\d]+/", "/XXXXX/");

但这有两个问题:

  • 替换大小与原始字符串长度不匹配。
  • 替换字符是硬编码的。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    在 Java 中你可以使用:

    str = str.replaceAll("(/|(?!^)\\G)\\d(?=\\d*(?:/|$))", "$1X");
    

    RegEx Demo

    正则表达式详细信息:

    • \G 在上一个匹配的结尾或第一个匹配的字符串的开头断言位置。
    • (/|(?!^)\\G):匹配/ 或捕获组#1 中上一场比赛的结束(但不是开始)
    • \\d:匹配一个数字
    • (?=\\d*(?:/|$)):确保数字后跟/ 或结尾。
    • 替换: $1X:将其替换为捕获组 #1,然后是 X

    【讨论】:

    • 非常好,但您需要在斜杠或字符串结尾处关闭,以避免匹配数字后跟非数字字符。
    • 当然,(/|(?!^)\G)\d(?=\d*(?:/|$)) 可以用来确保这一点,但是 OP 的要求中没有特别提到这种情况。
    • 也许我误解了 OP 的第一句话:“我只想替换字符串的数字部分。”
    【解决方案2】:

    这里不是Java 的人,但这个想法应该是可以转移的。只需捕获/、数字和/(可选),计算第二组的长度,然后再次返回。

    所以

    (/)(\d+)(/?)
    

    变成

    $1XYZ$3
    

    参见 a demo on regex101.comthis answer 的 lambda 等效于例如PythonPHP

    【讨论】:

    • 感谢简的回复。但是 Java 正则表达式与其他语言几乎没有什么不同,并没有真正映射 1-1。 @anubhava 的另一个答案有效。
    【解决方案3】:

    首先你需要这样的东西:

    String new_s1 = s3.replaceAll("(\\/)(\\d)+(\\/)?", "$1XXXXX$3");
    

    【讨论】:

    • 感谢您的回复。但是,这并不能解决问题中提到的两个问题中的任何一个。请参考@anubhava 的答案,它非常适合这些。
    • 确实,他提供了最好的答案。脱帽致敬!
    猜你喜欢
    • 2015-04-17
    • 2014-08-23
    • 1970-01-01
    • 2013-05-11
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多