【问题标题】:Regex not valid when trying to invalidate alpha's and non-zeros尝试使 alpha 和非零无效时,正则表达式无效
【发布时间】:2014-08-15 05:09:22
【问题描述】:

编写了一个接收字符串并检查以下条件的方法:

  1. 如果 String 为“quit”,它将终止程序。
  2. 如果字符串是整数以外的任何值,它应该返回“无效输入”。
  3. 任何负整数和 0 都应返回“无效输入”。

但是,当我传入 10 时,它返回为“无效输入”?

请指教:

public static String validate(String input) {
    Pattern pattern = Pattern.compile(".*[^1-9].*");
    StringBuilder results = new StringBuilder();
    if (input.equals("quit")) {
        System.exit(1);
    } else if (!pattern.matcher(input).matches() == false) {
        results.append("Invalid input ");
        results.append("'");
        results.append(input);
        results.append("'");
    }
    return results.toString();
}

我在做什么有什么问题?

【问题讨论】:

  • 您的正则表达式匹配至少包含一个除 1-9 之外的字符的任何字符串。这可能根本不是您想要的。
  • if (!pattern.matcher(input).matches() == false)if (pattern.matcher(input).matches()) 相同

标签: java regex


【解决方案1】:

你应该写出你期望的模式,而不是你不期望的模式。 描述你想要的总是比描述其余部分更简单。

所以你期望:

Pattern acceptPattern = Pattern.compile("[1-9][0-9]*");

您可以考虑通过不同时使用!== false 来使条件表达式更简单和正确:

这将使:

if (!acceptPattern .matcher(input).matches()) {//Invalid input code}

if (acceptPattern .matcher(input).matches() == false) {//Invalid input code}

注意:

你写 if(!A == false) => if(A == true) => if(A) 但这是相反的

【讨论】:

    【解决方案2】:

    您似乎想要匹配一个或多个数字,其中第一个不是零。

    [1-9]\d*
    

    如果你想强制它是整个字符串,你可以添加锚点,像这样:

    ^[1-9]\d*$
    

    【讨论】:

    • 请注意,这不允许(大部分)有效整数,如011
    【解决方案3】:

    您的正则表达式字符串不允许出现零(不仅仅是一个零)。

    也就是说,字符串 ".*[^1-9].*" 正在寻找“任意数量的字符,不是 1-9 的字符,以及任意数量的字符”。当它找到零时,它会给你错误的结果。

    查看What is the regex for "Any positive integer, excluding 0" 了解如何更改。

    该页面上最有用的解决方案可能是正则表达式[0-9]*[1-9][0-9]*(用于有效整数)。这允许前导零和/或内部零,这两者都可以存在于有效整数中。在使用Matcher#matches 时,您还可以确保此正则表达式匹配整个输入,而不仅仅是其中的一部分(无需添加开始和结束锚点——^$)。

    另外,else if (!pattern.matcher(input).matches() == false) 行可以更清晰......也许可以试试else if (pattern.matcher(input).matches())

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多