Java 正则表达式查找int或double

Java 正则表达式查找int或double,java,regex,Java,Regex,我正在检查高度是否有效。要有效,它必须是1或1.4或1.0或1。等等,它不能是字符串、数字或小数旁的任何字符。小数点不能位于字符串的开头,并且只能有1个小数点。我一直在尝试的正则表达式是: "/^[0-9]+([\\,\\.][0-9]+)?$/" 但它不工作,仍然接受字符串。任何帮助都会很好,谢谢 public static boolean HeightValid(String height) { boolean isHeightValid = true;

我正在检查高度是否有效。要有效,它必须是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;
  }
公共静态布尔高度有效(字符串高度)
{
布尔值:有效=真;
如果(!height.matches(“/^[0-9]+([\\,\\.][0-9]+)?$/”)高度.length()<1高度.length()>9)
{
有效=假;
}
其他的
{
double doubleHeight=double.parseDouble(高度);
DecimalFormat df=新的DecimalFormat(#.00”);
String decHeight=df.format(doubleHeight);
heightField.setText(Dechheight);
}
返回有效期;
}

如果您需要更多信息,请添加评论,谢谢您使用正则表达式的原因是什么?您可以尝试从中使用Double.parseDouble()

然后,如果格式不正确,无法以自己的方式处理用户输入错误,则捕获NumberFormatException

编辑:我一开始并没有阅读你所有的代码。您可以去掉第一条if语句,并在到达catch块时尝试捕获Double.parseDouble(height),您知道它没有成功。

这应该可以:

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

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

在使用正则表达式之前尝试它是很好的,这个网站非常直观:

我想你应该用:
^[0-9]+(.|,)?[0-9]?$


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

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

接受这些:
0,
00,0

但不接受
1000.00

好的正则表达式很难写


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

我必须再次使用try,catch

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

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

您需要的正则表达式是:

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

通过测试,它可以工作。

可以让您开始工作-
编辑掉的分隔符

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

使用
Regex
I测试并确认以下各项正常工作:

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

java文档为此提供了一个正则表达式

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

避免在无效字符串上调用此方法并具有 如果抛出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
}


可以使用正则表达式将不需要的值与希望使用的值剥离,并替换为空格。然后可以在空间上拆分并解析为双精度。这是C语言的一个解决方案#

newregex(@“[^0-9.]+”)
.更换(stringWhichYouFilter,“”)
.拆分(“”)
.Where(x=>!string.IsNullOrWhiteSpace(x))
.选择(x=>
{
if(double.TryParse(x,out var doubleVal))
返回doubleVal;
抛出新的InvalidCastException($“无法将值“{x}”解析为双精度”);
})

为什么要使用正则表达式?为什么要使用正则表达式?这不是真正的目的。如果要查看字符串是否为int,请使用内置的int解析函数。如果您想查看它是否是double,请使用double解析函数。放下巧克力香蕉,远离欧洲货币体系。(编辑:我把它误读为C#,durp。注释仍然有效,不过,只是没有函数的名称。),可能的帮助:正则表达式是验证数字输入的完美选择。请注意,建议使用内置解析函数而不是正则表达式的每个人:OP的正则表达式建议他希望在输入中允许逗号字符,这是内置解析函数不允许的。我会将
try
catch
仅放在第一条语句周围。或者将
catch
更改为仅捕获
NumberFormatException
,而不是捕获所有
异常。按照您的编写方式,如果代码的其余部分出现错误,并且出现了问题,则该方法将(错误地)报告输入无效,而不是转储堆栈跟踪,以帮助您找出代码错误的地方。@ajb-Java中没有regex delimeters?@sln Correct。请参阅我的答案。请注意,
Double.parseDouble()
也不会接受
“1000.00”
。这是每个人的答案中的一个缺陷,建议使用其中一个解析函数而不是正则表达式。它不允许OP可能希望接受的格式,但内置解析函数不允许(例如输入中带有逗号)。