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

标签 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 收到解析异常。

用户名 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/

相关文章:

用于嵌入 bbcode 的 Javascript 正则表达式

c# - 用于在自定义文本之间进行匹配的正则表达式

java - JSch get() 因 NullPointerException 而失败

java - 实现另一个接口(interface)的解决方法接口(interface)

java - 从 Jira 获取所有工作时间

java - List<Integer> 类型的 trimToSize() 方法未定义

mysql 查询只获取十六进制ascii 数据?

c# - 方括号中的正则表达式前面或后面没有

javascript - imacros 提取具有特定宽度的表

java - 什么是抑制异常?