【问题标题】:Regex to find int or double正则表达式查找 int 或 double
【发布时间】:2014-01-27 17:33:58
【问题描述】:

我正在尝试检查高度是否有效。要有效,它必须是 1 或 1.4 或 1.0 或 1。等等,它不能是字符串、数字或小数旁边的任何字符。小数点不能位于字符串的开头,并且只能有 1 个小数点。我一直在尝试的正则表达式是:

 "/^[0-9]+([\\,\\.][0-9]+)?$/"

但它不工作并且仍然接受字符串。任何帮助都会很棒,谢谢!

 public static boolean HeightValid(String height)
 {
        boolean isHeightValid = true;


        if(!height.matches("/^[0-9]+([\\,\\.][0-9]+)?$/") || height.length() < 1 || height.length() > 9)
           {
           isHeightValid = false;
           }
       else
           {
             double doubleHeight = Double.parseDouble(height);
             DecimalFormat df = new DecimalFormat("#.00");
             String decHeight = df.format(doubleHeight);
             heightField.setText(decHeight);

           }

  return isHeightValid;
  }

如果您需要更多信息,请添加评论,谢谢

【问题讨论】:

  • 你为什么要为此使用正则表达式?
  • 为什么要使用正则表达式?这不是它的真正用途。如果要查看字符串是否为 int,请使用内置的 int 解析函数。如果要查看是否为双精度,请使用双精度解析功能。放下巧克力香蕉,远离欧洲货币体系。 See also.(编辑:我把它误认为是 C#,durp。不过,注释仍然有效,只是函数名不成立。)
  • 另外,可能会有帮助:stackoverflow.com/questions/8391979/…
  • Regex 是验证数字输入的完美选择。
  • 所有建议使用内置解析函数而不是正则表达式的人请注意:OP 的正则表达式建议他希望在输入中允许逗号字符,而内置解析函数不允许允许。

标签: java regex


【解决方案1】:

只是想指出使用正则表达式可能存在一些缺陷,例如

接受这些:0,00,0

但不接受1,000.00

一个好的正则表达式很难写。

对于像这样的简单情况,使用 Double.parseDouble() 和其他人提到的 try-catch 块会更合适。

【讨论】:

  • 请注意Double.parseDouble() 也不接受"1,000.00"。这是每个人的答案的一个缺陷,建议使用其中一个解析函数而不是正则表达式。它不允许 OP 可能想要接受但内置解析函数不接受的可能格式(例如其中带有逗号的输入)。
【解决方案2】:

应该这样做:

"^[0-9]+([,.][0-9]?)?$"

编辑:我删除了斜线。我看到这里发布的所有其他模式的缺陷。您不需要转义 [] 内的字符 - 除了 ] 。该问题没有限制小数点分隔符之前的位数。但它只允许小数点后一位。

【讨论】:

  • @ajb - Java 中没有正则表达式分隔符?
  • @sln 正确。看我的回答。
【解决方案3】:

在使用它之前尝试一个正则表达式很好,这个网站非常直观: https://www.debuggex.com/

我认为你应该选择:^[0-9]+(.|,)?[0-9]?$

也就是说,neminem 和 Johnsyweb 是对的,您不必为此使用正则表达式。

【讨论】:

    【解决方案4】:

    您为什么要使用正则表达式?您可以尝试使用 http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#parseDouble(java.lang.String 中的 Double.parseDouble()

    如果格式不正确,则捕获 NumberFormatException 以您自己的方式处理该用户输入错误。

    编辑:我一开始并没有阅读您的所有代码。您可以去掉第一个 if 语句,并在 Double.parseDouble(height) 上执行 try-catch,如果它到达您知道它没有成功的 catch 块。

    【讨论】:

      【解决方案5】:

      您真的需要输入字符串包含斜杠(/ 字符)吗?如果没有,请将它们从您的正则表达式中删除。 Perl 和 JavaScript 使用斜杠字符来表示“正则表达式文字”,这是这些语言中内置的用于模式匹配的东西。 Java 没有正则表达式文字;正则表达式模式是从普通的字符串文字创建的。因此不使用斜杠,如果你把一个斜杠放在一个正则表达式中,它假设你真的想匹配一个斜杠。

      【讨论】:

        【解决方案6】:

        你需要的正则表达式是这个:

        ^[0-9]+([\\,\\.][0-9]+)?$
        

        测试过,可以的。

        【讨论】:

          【解决方案7】:

          我必须使用try,再次捕获..

                   try
                     {
                       double doubleHeight = Double.parseDouble(height);
                       DecimalFormat df = new DecimalFormat("#.00");
                       String decHeight = df.format(doubleHeight);
                       if(decHeight.charAt(0)=='.')
                       {
                           decHeight = "0" + decHeight;
                       }
          
                     }
          
                  catch(NumberFormatException e)
                  {          
                     isHeightValid = false;             
                  }
          

          【讨论】:

          • 我会把try..catch 放在only第一条语句的周围。或者将catch 更改为仅捕获NumberFormatException,而不是所有Exceptions。您编写它的方式,如果您的其余代码中存在错误并且出现问题,该方法将(错误地)报告输入无效,而不是转储堆栈跟踪以帮助您找出您的位置代码错误。
          【解决方案8】:

          可以帮助您入门 -
          编辑了分隔符

           #  "^(?:[1-9]\\d{0,2}(?:,\\d{3})*(?:[.]\\d*)?|\\d+[.]?\\d*)$"
          
           ^ 
           (?:
                [1-9] 
                \d{0,2} 
                (?:
                     , \d{3} 
                )*
                (?:
                     [.] \d* 
                )?
             |  
                \d+ [.]? \d* 
           )
           $
          

          相同但更紧凑的格式 -

           ^ 
           (?:
                [1-9] \d{0,2} 
                (?: , \d{3} )*
                (?: [.] \d* )?
             |  
                \d+ [.]? \d* 
           )
           $
          

          【讨论】:

            【解决方案9】:

            使用Regex我测试并确认以下工作正常:

            ^\\d+(\\.\\d+)?
            

            【讨论】:

              【解决方案10】:

              java 文档为此目的提供了一个正则表达式https://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#valueOf(java.lang.String)

              这比人们希望的要复杂一些:) 不过,您可以从这里开始,根据您的具体情况进行所需的任何临时更改。

              为了避免在无效字符串上调用此方法并使用 NumberFormatException 被抛出,下面的正则表达式可以是 用于筛选输入字符串:

                final String Digits     = "(\\p{Digit}+)";
                final String HexDigits  = "(\\p{XDigit}+)";
                // an exponent is 'e' or 'E' followed by an optionally
                // signed decimal integer.
                final String Exp        = "[eE][+-]?"+Digits;
                final String fpRegex    =
                    ("[\\x00-\\x20]*"+  // Optional leading "whitespace"
                     "[+-]?(" + // Optional sign character
                     "NaN|" +           // "NaN" string
                     "Infinity|" +      // "Infinity" string
              
                     // A decimal floating-point string representing a finite positive
                     // number without a leading sign has at most five basic pieces:
                     // Digits . Digits ExponentPart FloatTypeSuffix
                     //
                     // Since this method allows integer-only strings as input
                     // in addition to strings of floating-point literals, the
                     // two sub-patterns below are simplifications of the grammar
                     // productions from section 3.10.2 of
                     // The Java™ Language Specification.
              
                     // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
                     "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
              
                     // . Digits ExponentPart_opt FloatTypeSuffix_opt
                     "(\\.("+Digits+")("+Exp+")?)|"+
              
                     // Hexadecimal strings
                     "((" +
                      // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
                      "(0[xX]" + HexDigits + "(\\.)?)|" +
              
                      // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
                      "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
              
                      ")[pP][+-]?" + Digits + "))" +
                     "[fFdD]?))" +
                     "[\\x00-\\x20]*");// Optional trailing "whitespace"
              
                if (Pattern.matches(fpRegex, myString))
                    Double.valueOf(myString); // Will not throw NumberFormatException
                else {
                    // Perform suitable alternative action
              

              }

              【讨论】:

                【解决方案11】:

                您可以做一个正则表达式,用您希望使用的值去除不需要的值并用空格替换。然后,您可以拆分空间并解析为双精度。这是 C# 的解决方案

                new Regex(@"[^0-9.]+")
                                .Replace(stringWhichYouFilter, " ")
                                .Split(" ")
                                .Where(x => !string.IsNullOrWhiteSpace(x))
                                .Select(x =>
                                {
                                    if (double.TryParse(x, out var doubleVal))
                                        return doubleVal;
                                    throw new InvalidCastException($"could not parse value '{x}' to a double");
                                })
                
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-03-25
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多