2011-07-01 37 views
2

考慮以下字符串:JAVA:REG的replaceAll模式

String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif"; 

我怎樣可以刪除 「靜態/ 201105-3805-somerandom /」 的一部分? 的 「201105-3805-somerandom」 部分完全是隨機的,但總是的組成如下: - 6位數 - 「 - 」 的字符 - {1,N}數字字符 - 「 - 」 的字符 - {1- ,n}數字和字母字符

如果我使用"/static/[0-9]*-[0-9]*-*/";,它會將所有內容都替換爲最後/而不是緊跟在「{1,n}數字和字母字符後面」,我錯過了什麼?

+1

如果它始終是3斜槓,你不需要一個正則表達式。只需使用'indexOf'-方法。 – Jacob

回答

1
s = s.replaceAll("^/static/\\d{6}-\\d{1,}-.*?/","") 
4

嘗試更改爲此:

/static/[0-9]*-[0-9]*-.*?/ 

*是默認的貪婪,指定*?使得它不願意。

Alternativaly,你也可以做到這一點沒有一個正則表達式是這樣的:

String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif"; 
System.out.println(s.substring(s.indexOf('/', "/static/".length()))); 

這將開始搜索/啓動靜態部分後,立即指數。這將輸出:

/images/optional-folder/filename.gif 
2

您需要非貪婪*:

"/static/[0-9]*-[0-9]*-.*?/" 
0

試試這個:

String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif"; 
    String regex = "/static/\\d{6}-\\d{4}-.*?/"; 
    System.out.println(s.replaceAll(regex, "")); // "images/optional-folder/filename.gif" 

你在哪裏使用 「貪婪」 匹配.*,但你需要非貪婪的比賽.*?

0

嘗試"/static/[0-9]*-[0-9]*-[0-9a-zA-A]*?/"也許?

0

用途:

/static/[0-9]{6}-[0-9]*-[a-zA-Z0-9]*// 

你的最後*前/簡單地匹配所有後面的字符(包括斜槓),所以你需要更具體和我們[A-ZA-Z0-9]代替。

0

除了正則表達式,它會工作,如果「/圖片...」是固定的:

String given = "/static/201105-3805-somerandom/images/optional-folder/filename.gif"; 
String replaced = given.substring(given.indexOf("/images"), given.length()); 
0

要在擴展@約翰的回答,如果String格式不應該從有機磷農藥需求偏離,其中「 somerandom「被限制爲數字和字母字符,則以下正則表達式將起作用:

"/static/\\d{6}-\\d+-\\p{Alnum}+/" 

這裏假定字符是US-ASCII。但是,如果您需要支持Unicode字符(請參閱Unicode General Category,第4節。5,第126頁),你可以使用下面的正則表達式:

"/static/\\d{6}-\\d+-(\\p{Lu}|\\p{Ll}|\\p{Nd})+/" 

如果 「somerandom」 的轉變是真正隨機的(不包括/字符),下面的工作:

"/static/\\d{6}-\\d+-[^/]+/"