匹配可能为负数的可能为负的数字

时间:2014-02-24 22:04:23

标签: java regex

我正在用Java构建温度转换器。用户将在JTextField中输入一个数字,使用JComboBox选择其起始标签,然后使用JRadioButton中的ButtonGroup选择其结束标签。用户输入的数字可能具有不同的可能性。它可以是

  • 单个整数,例如 5
  • 多个整数,例如 55
  • 双倍,例如 5.5
  • 上述任何一项的否定版本,例如 -5 -55 -5.5

JTextField有一个方法getText(),它返回字符串的值。然后将其转换为double,最后转换为所需的结束标签。由于必须将String转换为double,因此JTextField中不允许使用字母字符。所以我使用正则表达式来解决这个问题。我目前有

String tempV = startTempValInput.getText();
if (tempV.matches("-?[0-9]+\\.[0-9]+")) {
   // Code Here
}

但是,这不能识别单个或多个整数。如何修改它以包含整数?

4 个答案:

答案 0 :(得分:2)

tempV.matches("-?[0-9]+(\\.[0-9]+)?")

打破它:

  • -? - 这将匹配0或1的负数
  • [0-9]+ - 这将匹配数字字符1次或多次
  • (\\.[0-9]+)? - 这会将可能的小数位与无穷大相匹配
    • \\. - 这将匹配一段时间。需要双重转义,因为Java将正则表达式识别为普通字符串。这意味着你必须逃避反斜杠
    • [0-9]+ - 这将匹配数字字符1次或多次
    • 这全部包含在()?中,因为它是可选的小数位。如果您尝试使用-?[0-9]+\\.?[0-9]+,则无法识别单个整数。它会将负数和句点视为可选项,但由于+返回1或更多,因此至少需要两个整数。

另一种选择是

tempV.matches("-?([0-9]+\\.)?[0-9]+")

答案 1 :(得分:0)

  

因为必须将String转换为double,所以在JTextField中不允许使用字母字符

2.0E3怎么样?

我只会使用Double.parseDouble,然后抓住NumberFormatException

try {
    Double.parseDouble(inStr);
} catch (NumberFormatException e) {
    // string doesn't represent a double
}

你可以用正则表达式自己做,但是需要考虑各种边缘情况:科学记数法(如上所示),领先+等等。它当然可以管理,但为什么要编写代码来完成某些事情那已经为你做了什么?

答案 2 :(得分:0)

你可以用这个覆盖所有的基础:
编辑 - 确保某个位置,感谢@yshavit

^(?=\D*\d)(?=[\d.-]+$)-?\d*\.?\d*$

可以扩展到更多内容:
已修改 - 简化版本,不需要某些断言。

 # (?i)^(?=[^e]*\d)[+-]?\d*\.?\d*(?:e[+-]?\d+)?$
 # "(?i)^(?=[^e]*\\d)[+-]?\\d*\\.?\\d*(?:e[+-]?\\d+)?$"


 (?i)                   # Case insensitive modifier
 ^                      # Beginning of string
 (?= [^e]* \d )         # Lookahead must be a digit (and before exponent)
 [+-]? \d* \.? \d*      # Consume correct numeric form 
 (?: e [+-]? \d+ )?     # Consume correct exponent form
 $                      # End of string

答案 3 :(得分:0)

捕获大范围双输入的模式是:

^(?![+-]$|[-+]E|E|$|\.$)[+-]?\d*(\.?\d*)?(E-?\d+)?$

匹配边缘情况:

1
1.
.1
4E7
3.4E-5
+7.4
-5

查看live demo

因为每个术语都是可选的,所以需要采取负面展望来捕捉原本会匹配的退化案例。

请注意,此正则表达式不会阻止过度/不足流量,例如1E9999,它太大而无法表示双倍。