2

考虑以下字符串:

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

4

8 回答 8

4

尝试将其更改为:

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

*默认情况下是贪婪的,指定*?使其不情愿。

或者,您也可以在没有这样的正则表达式的情况下执行此操作:

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
于 2011-07-01T09:38:15.357 回答
2

你需要非贪婪*:

"/static/[0-9]*-[0-9]*-.*?/"
于 2011-07-01T09:38:35.940 回答
1
s = s.replaceAll("^/static/\\d{6}-\\d{1,}-.*?/","")
于 2011-07-01T09:39:01.190 回答
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"

你在哪里使用“贪婪”匹配.*,但你需要一个非贪婪匹配.*?

于 2011-07-01T09:39:11.530 回答
0

试试"/static/[0-9]*-[0-9]*-[0-9a-zA-A]*?/"吧?

于 2011-07-01T09:39:18.257 回答
0

采用:

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

/ 之前的最后一个 * 仅匹配所有后续字符(包括正斜杠),因此您需要更具体,而我们 [a-zA-Z0-9] 代替。

于 2011-07-01T09:40:03.820 回答
0

除了正则表达式,如果 "/images..." 是固定的,它将起作用:

String given = "/static/201105-3805-somerandom/images/optional-folder/filename.gif";
String replaced = given.substring(given.indexOf("/images"), given.length());
于 2011-07-01T09:43:14.300 回答
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+-[^/]+/"
于 2011-07-01T12:17:35.170 回答