我需要编写一个正则表达式来验证表单中的输入。我想限制使用这些字符: \ /& < > “。其他一切都是允许的。
有效输入的示例包括:My Basket
,Groceries
,Fruits
,£$%
和+=
。
无效输入的示例包括:A&B
,A > B
,2 / 3
和A<>C
。
下面是我正在使用的代码无法正常工作,因为它返回的有些输入有效而不是实际上是无效的。
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("\nEnter text: ");
String inputText = br.readLine();
System.out.println("\nThe input is " + (isValidInput(inputText) ? "valid" : "invalid"));
}
}
public static boolean isValidInput(String inputText) {
Pattern p = Pattern.compile("[^/\\\\/&<>\"]");
Matcher matcher = p.matcher(inputText);
return matcher.find();
}
}
答案 0 :(得分:2)
查找[^/\\\\&<>\"]
只会检查至少有一个角色不是被禁止的角色。
如果要检查整个字符串是否由允许的字符组成,则必须锚定正则表达式:
Pattern.compile("^[^/\\\\&<>\"]*$").matcher(inputText).find();
^$
匹配字符串的开头和结尾。
或者,正如@devnull指出的那样,默认情况下你可以使用String.matches
wihch锚定正则表达式:
inputText.matches("[^/\\\\&<>\"]*")
答案 1 :(得分:1)
如果找到任何不在列表中的字符,则无论字符串的其他部分是否存在此类字符,您的查找都将成功。尝试:
"^[^/\\\\/&<>\"]*$"
答案 2 :(得分:1)
使用否定前瞻来查找字符串是否包含\ / & < > "
if (subjectString.matches("^(?!.*[\\\\/&<>\"]).*$")) {
// VALID STRING
} else {
// INVALID STRING
}