使用正则表达式测试有效/无效字符串

时间:2012-06-04 06:16:40

标签: java regex string

我通过检查某些字符是否存在来测试字符串是否有效/无效。包含的字符串; #/%= | + \“<>被视为无效。我目前在Java中有以下实现,但我更喜欢更优雅的正则表达式解决方案。

public boolean isStringValid(String name) {
    if (   name.contains(";")
        || name.contains("#")
        || name.contains("/")
        || name.contains("%")
        || name.contains("=")
        || name.contains("|")
        || name.contains("+")
        || name.contains("\\")
        || name.contains("\"")
        || name.contains("<")
        || name.contains(">")) {
        return false;
    }
    else {
        return true;
    }
}

我所做的是将其更改为以下内容,

public boolean isNameValid(String name) {
    return !Pattern.matches(".*(;|#|/|%|=|\\||\\+|\\\\|\"|<|>)+.*", name);
}

但我似乎无法正确使用正则表达式字符串。添加所有Java转义字符之前的原始正则表达式字符串如下,

.*(;|#|/|%|=|\||\+|\\|"|<|>)+.*

使用像[A-z]这样的字符类似乎不是一个选项,因为在我的情况下,像“d @ vik”这样的名称应被视为有效。

2 个答案:

答案 0 :(得分:1)

你可以否定角色类:

Pattern.matches("[^;#/%=|+\\\\\"<>]+", name);

答案 1 :(得分:1)

你几乎是对的。只需使用find()方法而不是matches()。并且只编译一次模式。这是最昂贵的操作。您可以使用[ ]简化模式:在这种情况下,您不必在要查找的子模式之间编写|

private static Pattern validator = Pattern.compile("[;%#=\\+]"); // etc: write all characters you need.

现在重新编写isNameValid(),如下所示:

public boolean isNameValid(String name) {
    return !validator.find();
}
BTW注意反斜杠。如果你希望你的模式包含反斜杠,它应该写4次:正则表达式转义两次,java转义两次。