我已经找到了解决方案,但我想知道它是否可以提高效率或更具可读性。
我的应用的用户可以输入他们的全名,例如”Paul McCartney”
,我建议使用简短的用户名。 用户名应仅接受小写字母,数字和点(。)。为了解释,让我说明我是如何做到的(可能存在缺陷,欢迎您加以改进):
public static String formatUsername(String source) {
return source
.trim()
.toLowerCase()
.replaceAll("\\s", ".") // replace spaces with dots
.replaceAll("[^a-z[0-9][\\.]]+", "") // remove all the rest
.replaceAll("[\\.]{2,}", "."); // avoid sequences of dots like “.."
}
结果为paul.mccartney
。
现在我还需要一个函数来告诉我某个String是否是可接受的用户名。检查字符很简单:
return Pattern.matches("[a-z[0-9][\\.]]+", input)
但我想避免两个或多个点的序列,例如paul..mccartney
不合适。我尝试使用"[a-z[0-9][\\.]?]+"
,但它不起作用。目前我正在使用它:
return Pattern.matches("[a-z[0-9][\\.]]+", shortName)
&& !Pattern.compile("[\\.]{2,}").matcher(shortName).find();
但我觉得存在更好的解决方案,至少更具可读性。
答案 0 :(得分:3)
您可以使用此正则表达式验证:
^(?!.*\.\.)[a-z0-9.]+$
如果(?!.*\.\.)
出现在任何地方,则 ..
是否定前瞻性断言以使匹配失败。
在Java中:
boolean valid = input.matches("^(?!.*\\.\\.)[a-z0-9.]+$");
答案 1 :(得分:1)
订单和非正则表达式替换。
public static String formatUsername(String source) {
return source
.toLowerCase()
.replaceAll("\\W+", " ") // non-word chars with space
.trim()
.replace(' ', '.');
}
(这也允许使用下划线。)