簡體   English   中英

Java Regex 僅替換部分字符串 (url)

[英]Java Regex to replace only part of string (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

請注意,我沒有從/api/v1替換1

到目前為止,我只有以下似乎在大多數情況下都有效:

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

但這有兩個問題:

  • 替換大小與原始字符串長度不匹配。
  • 替換字符是硬編碼的。

有一個更好的方法嗎?

在 Java 中,您可以使用:

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

正則表達式演示

正則表達式詳情:

  • \\G斷言位置在前一個匹配的末尾或第一個匹配的字符串的開頭。
  • (/|(?!^)\\\\G) : 匹配/或捕獲組 #1 中前一個匹配的結尾(但不在開始處)
  • \\\\d : 匹配一個數字
  • (?=\\\\d*(?:/|$)) :確保數字后跟/或結尾。
  • 替換: $1X :用捕獲組 #1 后跟X替換它

不是這里的Java人,但這個想法應該是可以轉移的。 只需捕獲/ 、數字和/可選,計算第二組的長度,然后再返回。

所以

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

變成

$1XYZ$3

請參閱regex101.com 上的演示此答案了解PythonPHP等價的 lambda。

首先你需要這樣的東西:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM