正则表达式找到int或double

时间:2014-01-27 17:33:58

标签: java regex

我正在尝试检查高度是否有效。为了有效它必须是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;
  }

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

11 个答案:

答案 0 :(得分:2)

您使用正则表达式的原因是什么?您可以尝试使用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块。

答案 1 :(得分:2)

这应该做:

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

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

答案 2 :(得分:2)

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

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

那就是说,neminem和Johnsyweb是对的,你不必使用正则表达式。

答案 3 :(得分:2)

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

接受这些:0, 00,0

但不接受1,000.00

好的正则表达式很难写。

对于这样一个简单的例子,使用Double.parseDouble()和try-catch块会更合适。

答案 4 :(得分:1)

我必须尝试使用​​,再次捕获..

         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;             
        }

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

经过测试,它有效。

答案 7 :(得分:1)

可以帮助你开始 -
已修改的分隔符

 #  "^(?:[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* 
 )
 $

答案 8 :(得分:0)

我使用Regex进行了测试,并确认以下各项有效:

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

答案 9 :(得分:0)

为此,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

}

答案 10 :(得分:0)

您可以执行一个正则表达式,用您希望使用的值去除不需要的值并用空格替换。然后,您可以在空间上拆分并解析为双精度值。这是 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");
                })