嗨我有一个正则表达式,如果我作为一个独立的java应用程序运行并返回true,它正常工作:
public class Example {
private static final String VALID_ADVISOR_NAME_FORMAT =
"[a-zA-Z" + " " + "-" + "'" + "&" + "(" + ")" + "]";
public static void main(String[] args) {
System.out.println(isInvalidAdvisorName("%%%%%"));
}
public static boolean isInvalidAdvisorName(String name) {
return !name.matches(VALID_ADVISOR_NAME_FORMAT);
}
}
但是如果我在我的Web应用程序中使用相同的方法(在Tomcat中运行),则输出为false
。谁能告诉我为什么"%%%"
在独立应用程序中被视为无效,但在tomcat中运行的Web应用程序中有效?
答案 0 :(得分:1)
-
表示Unicode table中的字符范围。就像a-z
代表a
和z
之间的所有字符一样,[ -']
之类的正则表达式(您通过" " + "-" + "'"
创建它)代表space
之间的所有字符{1}}和'
。
现在让我们看一下Unicode table中某些字符的索引:
32
'
的索引为39 %
的索引为37
所以%
位于space
和'
之间,因此正则表达式[ -']
接受它作为有效字符。
要在-
内[ ]
文字,您需要
\-
(写为字符串"\\-"
)[-foo]
[bar-]
[a-z-1]
之后a-z
代表范围,-
放在它们之后(1
)将被视为文字。所以你可以尝试这种模式(并删除连接部分,它实际上使你的正则表达式更难阅读和发现错误)。
VALID_ADVISOR_NAME_FORMAT = "[a-zA-Z \\-'&()]";
此外,如果您希望您的模式接受所描述范围内的多个字符,请在字符类(+
表示一个或多个量化)之后添加+
。
VALID_ADVISOR_NAME_FORMAT = "[a-zA-Z \\-'&()]+";