JAVA:replaceAll reg pattern

时间:2011-07-01 09:35:37

标签: java regex replaceall

考虑以下字符串:

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}数字和字母字符”之后的内容,我错过了什么?

8 个答案:

答案 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+-[^/]+/"