正确使用String.matches和regex

问题描述

我正在尝试检查我的输入内容是否包含 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-的任何字符。