我在 Web 服务构造函数中有以下模式:
rUsername = Pattern.compile("[A-z0-9]{4,30}");
rPassword = Pattern.compile("[A-z0-9!@#$%&*()=+-\\\\s]{6,30}");
rQuestion = Pattern.compile("[A-z0-9\\\\s?]{5,140}");
rAnswer = Pattern.compile("[A-z0-9\\\\s]{1,30}");
如果我在部署 Web 应用程序时只有 2 个斜杠而不是 4 个斜杠,我会从 Tomcat 收到解析异常。
用户名 one 工作正常,但我似乎在密码、问题和答案方面遇到问题。密码将匹配“testasdas”但不匹配“test1234”,问题将不匹配任何带有空格的内容,答案似乎也不匹配任何内容。
我希望密码能够匹配小写和大写字母、数字、空格和我在其中输入的符号。第一个问题应该能够匹配大小写字母、数字、空格和“?”,而答案只能匹配大小写字母、空格和数字。
编辑:模式已更改为:
rPassword = Pattern.compile("[A-Za-z0-9!@#$%&*()=+\\s-]{6,30}");
rQuestion = Pattern.compile("[A-Za-z0-9\\s?]{5,140}");
rAnswer = Pattern.compile("[A-z0-9\\s]{1,30}");
这些或多或少是我想要的,但正如答案中指出的那样,我对密码字段的限制非常严格,这可能不是一个好主意。在保存之前我不会对任何东西进行哈希处理,因为这是一个没人会使用的大学项目,而且我知道这在现实世界中是个坏主意,但它不是项目要求的一部分。然而,我确实必须阻止 SQL 注入(inject)攻击,这就是为什么一切都如此严格的原因。这个想法主要是禁止使用 '
我知道的每个 SQL 攻击都需要起作用,但我不知道如何单独禁止该字符。
最佳答案
让我们看看您的第二个正则表达式:
[A-z0-9!@#$%&*()=+-\\\\s]
这里有几个错误。
[A-z]
不正确,你需要[A-Za-z]
因为Z
和之间有一些 ASCII 字符>a
您可能不想匹配。但这不是你的错误的问题。
这个部分有更多问题:
+-\\\\s
从 Java 字符串翻译成实际的正则表达式,这就变成了
+-\\s
这意味着(在字符类中)“匹配 +
和 \
之间的任何字符,或任何空格”。 [+-\\]
是一个有效范围 (ASCII 43-92),但这不是您想要的。
但是如果您现在删除两个额外的反斜杠,您的字符类将变为
+-\s
是语法错误,因为+
和“任何空白”之间没有 ASCII 范围。
解决方案:使用
[A-Za-z0-9!@#$%&*()=+\\s-]
或者首先不要对您的用户可以在密码中选择的字符施加限制。
关于java - 为什么我会得到这个正则表达式的解析异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12579606/