Java 为什么我会得到这个正则表达式的解析异常?
我在web服务构造函数中有以下模式:Java 为什么我会得到这个正则表达式的解析异常?,java,regex,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应用程
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会出现一个解析异常
用户名一的工作很好,但我似乎有问题的密码,问题和答案。密码将与“TestsDas”匹配,但与“test1234”不匹配,问题将与其中的空格不匹配,答案似乎与任何内容都不匹配
我希望密码能够匹配小写和大写字母、数字、空格以及我在其中输入的符号。问题1应该能够匹配小写和大写字母、数字、空格和“?”,答案只是大写和小写字母、空格和数字
编辑:模式已更改为:
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攻击都需要使用,但我不知道如何仅禁止该字符。要匹配大小写字母,需要给出模式:-[a-zA-Z]
尝试将您的模式更改为:-
[a-zA-Z0-9\\s]{1,30}
谢谢你的回答
对于不带空格的问题,可以使用\\S
-非空格字符
[a-zA-Z0-9\\S]{1250}
我认为应该行得通。。您可以对其余的2项进行相应的更改
*编辑:-您还可以使用\\p{Z}
匹配任何空白字符
有关使用Java正则表达式的良好教程,请参阅。让我们看看第二个正则表达式:
[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-]
或者首先不要限制用户在密码中可以选择的字符。在java中
\s
是无效的,因为它被解释为转义字符,所以您必须使用\`发送一个
`这就是我通常使用\\s
的原因。我确实在我的专栏文章中说过,如果我只是使用\\\s
,我从tomcat那里得到了一个解析错误,\\\\s
消除了这个错误。编辑:在我的模式中去掉了最后一个-
,现在\\s
正在工作。是的\s
是一个与空格
匹配的转义字符。。如果您确实希望字符串中包含\s
,则只需使用额外的反斜杠(
)进行转义即可使其成为\\s
。它实际上应该是\\s\s将给出编译器错误不是有效的回车+换行符,表示“避免对用户可能首先在密码中选择的字符施加限制”。如果我想包括希腊语/汉语,那为什么不呢?如果你在保存密码之前对密码进行哈希运算(你是在保存密码之前对密码进行哈希运算,对吗?),那应该没有任何区别,不,我知道这是你在现实世界中必须做的,但这是一个没有人会使用的大学项目,所以我一点也不担心安全问题。几乎只有我自己和我的导师会使用它。限制的主要原因是为了简化密码的清理,以便它进入我的SQL数据库,所以我真正需要做的就是不允许'
,对吗?我不知道该怎么做。我认为你问题的第二部分(带已编辑的正则表达式)应该转移到一个新问题。否则,答案就不合适了。