为什么我得到这个正则表达式的解析异常?

时间:2012-09-25 09:05:41

标签: java regex

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

用户名一个正常,但我似乎遇到密码,问题和答案的问题。密码将匹配“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攻击都需要工作,但我不知道如何仅仅禁止该角色。

2 个答案:

答案 0 :(得分:3)

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

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

这里有几个错误。

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

这一部分存在更多问题:

+-\\\\s

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

+-\\s

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

但是如果现在删除两个额外的反斜杠,那么你的角色类就会变成

+-\s

并且语法错误,因为+和“任何空格”之间没有ASCII范围。

解决方案:使用

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

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

答案 1 :(得分:0)

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

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

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

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

有关使用Java Regular Expression的详细教程,请参阅this link