诸如Rails和Django之类的Web框架内置了对“子弹”的支持,“子弹”用于生成可读且对SEO友好的URL:
团状串典型地只包含的字符a-z,0-9并-且可因此在不URL转义(认为“富%20巴”)编写的。
a-z
0-9
-
我在寻找一个Java蛞蝓函数给出任何有效的Unicode字符串将返回蛞蝓表示(a-z,0-9和-)。
一个普通的子弹函数可能类似于:
return input.toLowerCase().replaceAll("[^a-z0-9-]", "");
但是,此实现无法处理国际化和重音符号(ë> e)。解决此问题的一种方法是枚举所有特殊情况,但这并不是很好。我在寻找一些经过深思熟虑的方法。
ë
e
我的问题:
使用规范分解规范化您的字符串:
private static final Pattern NONLATIN = Pattern.compile("[^\\w-]"); private static final Pattern WHITESPACE = Pattern.compile("[\\s]"); public static String toSlug(String input) { String nowhitespace = WHITESPACE.matcher(input).replaceAll("-"); String normalized = Normalizer.normalize(nowhitespace, Form.NFD); String slug = NONLATIN.matcher(normalized).replaceAll(""); return slug.toLowerCase(Locale.ENGLISH); }
但是,这仍然是一个相当幼稚的过程。对于s-sharp(德语中使用的ß)或任何非基于拉丁语的字母(希腊语,西里尔字母,CJK等),它都不会做任何事情。
更改字符串大小写时请多加注意。 大写和小写形式取决于字母。在土耳其语中,U + 0069( i )的大写字母是U + 0130( İ),而不是U + 0049( I),因此,如果String.toLowerCase()在土耳其语区域设置下使用,则可能会在字符串中引入非latin1字符。
String.toLowerCase()