【问题标题】:correct usage of String.matches() and regex正确使用 String.matches() 和正则表达式
【发布时间】:2020-12-14 01:57:51
【问题描述】:

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

【问题讨论】:

  • 您的正则表达式只会匹配一个字符。 Pattern.compile(yourRegex).matcher(input).find() 会在字符串中的任何位置找到它。

标签: java regex match


【解决方案1】:

说明

我正在尝试检查我的输入是否包含除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();

这会告诉你它是否找到任何匹配正则表达式的东西,所以任何字符 not A-Za-z,\\.'\\s-

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 2013-03-21
    • 2011-06-13
    • 2017-01-18
    • 2020-10-29
    • 1970-01-01
    • 2017-12-22
    相关资源
    最近更新 更多