这个特殊的正则表达式出了什么问题?

时间:2014-04-24 13:11:39

标签: regex validation pattern-matching

我需要编写一个正则表达式来验证表单中的输入。我想限制使用这些字符: \ /& < > “。其他一切都是允许的。

有效输入的示例包括:My BasketGroceriesFruits£$%+=

无效输入的示例包括:A&BA > B2 / 3A<>C

下面是我正在使用的代码无法正常工作,因为它返回的有些输入有效而不是实际上是无效的。

public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            System.out.print("\nEnter text: ");
            String inputText = br.readLine();

            System.out.println("\nThe input is " + (isValidInput(inputText) ? "valid" : "invalid"));
        }
    }

    public static boolean isValidInput(String inputText) {

        Pattern p = Pattern.compile("[^/\\\\/&<>\"]");
        Matcher matcher = p.matcher(inputText);

        return matcher.find();
    }
}

3 个答案:

答案 0 :(得分:2)

查找[^/\\\\&<>\"]只会检查至少有一个角色不是被禁止的角色。

如果要检查整个字符串是否由允许的字符组成,则必须锚定正则表达式:

Pattern.compile("^[^/\\\\&<>\"]*$").matcher(inputText).find();

^$匹配字符串的开头和结尾。

或者,正如@devnull指出的那样,默认情况下你可以使用String.matches wihch锚定正则表达式:

inputText.matches("[^/\\\\&<>\"]*")

答案 1 :(得分:1)

如果找到任何不在列表中的字符,则无论字符串的其他部分是否存在此类字符,您的查找都将成功。尝试:

"^[^/\\\\/&<>\"]*$"

答案 2 :(得分:1)

使用否定前瞻来查找字符串是否包含\ / & < > "

if (subjectString.matches("^(?!.*[\\\\/&<>\"]).*$")) {
        // VALID STRING
    } else {
        // INVALID STRING
    }