Java 正则表达式查找int或double
我正在检查高度是否有效。要有效,它必须是1或1.4或1.0或1。等等,它不能是字符串、数字或小数旁的任何字符。小数点不能位于字符串的开头,并且只能有1个小数点。我一直在尝试的正则表达式是: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;
"/^[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可能希望接受的格式,但内置解析函数不允许(例如输入中带有逗号)。