确保String没有特定字符的序列(。)

时间:2016-01-18 19:14:28

标签: java regex string replace

我已经找到了解决方案,但我想知道它是否可以提高效率或更具可读性。

我的应用的用户可以输入他们的全名,例如”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();

但我觉得存在更好的解决方案,至少更具可读性。

2 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式验证:

^(?!.*\.\.)[a-z0-9.]+$
如果(?!.*\.\.)出现在任何地方,则

..是否定前瞻性断言以使匹配失败。

在Java中:

boolean valid = input.matches("^(?!.*\\.\\.)[a-z0-9.]+$");

RegEx Demo

答案 1 :(得分:1)

订单和非正则表达式替换。

public static String formatUsername(String source) {
    return source
            .toLowerCase()
            .replaceAll("\\W+", " ") // non-word chars with space
            .trim()
            .replace(' ', '.');
}

(这也允许使用下划线。)