1

我在 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 获得解析异常。

用户名 1 工作正常,但我似乎在密码、问题和答案方面遇到问题。密码将匹配“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 注入攻击,这就是为什么一切都如此严格的原因。这个想法主要是禁止使用'我知道的每个 SQL 攻击都需要工作,但我不知道如何仅禁止该字符。

4

2 回答 2

3

让我们看看你的第二个正则表达式:

[A-z0-9!@#$%&*()=+-\\\\s]

这里有几个错误。

  • [A-z]是不正确的,你需要,[A-Za-z]因为之间有一些 ASCII 字符Za你可能不想匹配。但这不是你的错误的问题。

更成问题的是这部分:

+-\\\\s

从 Java 字符串转换为实际的正则表达式,这变成

+-\\s

这意味着(在字符类中)“匹配 and 之间的任何字符+\或任何空格”。[+-\\]是一个有效范围(ASCII 43-92),但这不是你想要的。

但是,如果您现在删除两个额外的反斜杠,您的字符类将变为

+-\s

+一个语法错误,因为和“任何空白”之间没有 ASCII 范围。

解决方案:使用

[A-Za-z0-9!@#$%&*()=+\\s-]

或者首先不要对用户可以在密码中选择的字符施加限制。

于 2012-09-25T09:11:51.380 回答
0

要匹配大写和小写字母,您需要提供模式:-[a-zA-Z]

尝试将您的模式更改为: - [a-zA-Z0-9\\s]{1,30}为您的答案..

对于你的问题,不带空格,你可以使用\\S- 我认为它应该工作的非空格字符 [a-zA-Z0-9\\S]{1,250} 。你可以对剩余的 2 进行相应的更改。

*编辑: - 您也可以使用\\p{Z}匹配任何空白字符..

有关使用 Java 正则表达式的好教程,请参阅此链接。

于 2012-09-25T09:11:00.677 回答