我正在尝试检查高度是否有效。为了有效它必须是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;
}
如果您需要更多信息,请添加评论,谢谢
答案 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");
})