问题描述
我正在尝试检查我的输入内容是否包含但 A-Z a-z,. ' - and whitespace
。
我猜这是一个简单的错误,因为在正则表达式方面我是个菜鸟。
public class Test {
public static void main(String args[]) {
doesMatch(0,"Hello ',. - ");
doesMatch(1,"1Hello1");
doesMatch(2,"23123");
doesMatch(3,"§!$'##");
doesMatch(4,"pe33teramjd");
doesMatch(5,"3pe33teramjd");
doesMatch(6,"pe33teramjd3");
doesMatch(7,"yup py");
}
static void doesMatch(int number,String input){
System.out.println("Number: "+number+" | "+input.matches("[^A-Za-z,.'\\s-]"));
}
}
输出:
Number: 0 | false
Number: 1 | false
Number: 2 | false
Number: 3 | false
Number: 4 | false
Number: 5 | false
Number: 6 | false
Number: 7 | false
所需的输出:
Number: 0 | false
Number: 1 | true
Number: 2 | true
Number: 3 | true
Number: 4 | true
Number: 5 | true
Number: 6 | true
Number: 7 | false
解决方法
说明
我正在尝试检查我的输入内容中是否包含
A-Z a-z,. ' - and whitespace
以外的内容。
或者,相反的逻辑:您正在尝试验证文本是否仅由A-Z a-z,. ' - and whitespace
组成。
您可能打算重复您的正则表达式模式。因此,[...]+
不仅是[...]
,而只能匹配单个字符。
然后,摆脱^
,该表达式将否定表达式。另外,您必须转义.
,所以必须转义\\.
,否则它将匹配任何字符,而不匹配.
(点)。
正则表达式模式现在为"[A-Za-z,\\.'\\s-]+"
。现在您将收到以下输出:
Number: 0 | true
Number: 1 | false
Number: 2 | false
Number: 3 | false
Number: 4 | false
Number: 5 | false
Number: 6 | false
Number: 7 | true
只需用!
取反布尔值就可以了。
完整的代码供参考:
public class Test {
public static void main(String args[]) {
doesMatch(0,"Hello ',. - ");
doesMatch(1,"1Hello1");
doesMatch(2,"23123");
doesMatch(3,"§!$'##");
doesMatch(4,"pe33teramjd");
doesMatch(5,"3pe33teramjd");
doesMatch(6,"pe33teramjd3");
doesMatch(7,"yup py");
}
static void doesMatch(int number,String input){
System.out.println("Number: "+number+" | "+ !input.matches("[A-Za-z,\\.'\\s-]+"));
}
}
没有否定
如果您不想用!
来否定最终结果,则必须正确否定正则表达式模式,如果任何字符不是AZ az,。'-或空白,则非正式地将其为“它匹配”
可能是模式检查
".*[^A-Za-z,\\.'\\s-].*"
.*
表示任何字符序列。
搜索而不是完全匹配
与其尝试进行完全匹配,不如尝试使用find()
进行正则表达式搜索,这样可能会更好:
Pattern pattern = Pattern.compile("[^A-Za-z,\\.'\\s-]");
...
boolean result = pattern.matcher(input).find();
现在这将告诉您是否找到与正则表达式匹配的任何内容,因此没有 A-Za-z,\\.'\\s-
的任何字符。