考虑以下字符串:
String s = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
如何删除“static / 201105-3805-somerandom /”部分? “201105-3805-somerandom”部分是完全随机的,但始终由以下部分组成: - 6位数 - “ - ”字符 - {1,n}个数字字符 - “ - ”字符 - {1,n}数字和字母字符
如果我使用"/static/[0-9]*-[0-9]*-*/";
,它会将所有内容替换为最后一个/而不是“{1,n}数字和字母字符”之后的内容,我错过了什么?
答案 0 :(得分: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
答案 1 :(得分:2)
你需要非贪婪的*:
"/static/[0-9]*-[0-9]*-.*?/"
答案 2 :(得分:1)
s = s.replaceAll("^/static/\\d{6}-\\d{1,}-.*?/","")
答案 3 :(得分: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"
你在哪里使用“贪婪”的匹配.*
,但你需要一个非贪婪的匹配.*?
答案 4 :(得分:0)
尝试"/static/[0-9]*-[0-9]*-[0-9a-zA-A]*?/"
?
答案 5 :(得分:0)
使用:
/static/[0-9]{6}-[0-9]*-[a-zA-Z0-9]*//
你的最后一个*之前/只是匹配所有后续字符(包括正斜杠),所以你需要更具体,我们[a-zA-Z0-9]代替。
答案 6 :(得分:0)
除了正则表达式之外,如果“/ images ...”被修复,它将起作用:
String given = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
String replaced = given.substring(given.indexOf("/images"), given.length());
答案 7 :(得分:0)
要扩展@ John的答案,如果String
格式不应偏离OPs要求,其中“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+-[^/]+/"