我通过检查某些字符是否存在来测试字符串是否有效/无效。包含的字符串; #/%= | + \“<>被视为无效。我目前在Java中有以下实现,但我更喜欢更优雅的正则表达式解决方案。
public boolean isStringValid(String name) {
if ( name.contains(";")
|| name.contains("#")
|| name.contains("/")
|| name.contains("%")
|| name.contains("=")
|| name.contains("|")
|| name.contains("+")
|| name.contains("\\")
|| name.contains("\"")
|| name.contains("<")
|| name.contains(">")) {
return false;
}
else {
return true;
}
}
我所做的是将其更改为以下内容,
public boolean isNameValid(String name) {
return !Pattern.matches(".*(;|#|/|%|=|\\||\\+|\\\\|\"|<|>)+.*", name);
}
但我似乎无法正确使用正则表达式字符串。添加所有Java转义字符之前的原始正则表达式字符串如下,
.*(;|#|/|%|=|\||\+|\\|"|<|>)+.*
使用像[A-z]这样的字符类似乎不是一个选项,因为在我的情况下,像“d @ vik”这样的名称应被视为有效。
答案 0 :(得分:1)
你可以否定角色类:
Pattern.matches("[^;#/%=|+\\\\\"<>]+", name);
答案 1 :(得分:1)
你几乎是对的。只需使用find()
方法而不是matches()
。并且只编译一次模式。这是最昂贵的操作。您可以使用[
]
简化模式:在这种情况下,您不必在要查找的子模式之间编写|
:
private static Pattern validator = Pattern.compile("[;%#=\\+]"); // etc: write all characters you need.
现在重新编写isNameValid()
,如下所示:
public boolean isNameValid(String name) {
return !validator.find();
}
BTW注意反斜杠。如果你希望你的模式包含反斜杠,它应该写4次:正则表达式转义两次,java转义两次。