Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我会得到这个正则表达式的解析异常?_Java_Regex - Fatal编程技术网

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

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应用程

我在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数据库,所以我真正需要做的就是不允许
'
,对吗?我不知道该怎么做。我认为你问题的第二部分(带已编辑的正则表达式)应该转移到一个新问题。否则,答案就不合适了。