我在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攻击都需要工作,但我不知道如何仅仅禁止该角色。
答案 0 :(得分:3)
让我们来看看你的第二个正则表达式:
[A-z0-9!@#$%&*()=+-\\\\s]
这里有几个错误。
[A-z]
不正确,您需要[A-Za-z]
因为Z
和a
之间有一些您可能不想匹配的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。