1

我通过检查某些字符是否存在来测试字符串是否有效/无效。包含 ; 的字符串 # / % = | + \ " < > 被视为无效。我目前在 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转义字符之前的原始正则表达式字符串如下,

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

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

4

2 回答 2

1

您可以否定字符类:

Pattern.matches("[^;#/%=|+\\\\\"<>]+", name);
于 2012-06-04T06:28:43.130 回答
1

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

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

现在重写你isNameValid()如下:

public boolean isNameValid(String name) {
    return !validator.find();
}

顺便说一句,注意反斜杠。如果您希望您的模式包含反斜杠,则应编写 4 次:两次用于正则表达式转义,两次用于 Java 转义。

于 2012-06-04T06:31:52.903 回答