【问题标题】:Regex match also negative decimal numbers正则表达式也匹配负十进制数
【发布时间】:2019-04-23 09:14:10
【问题描述】:

我有以下正则表达式,用于匹配/验证十进制数:

String[] inputs = {
    "0",
    "0.0",
    "0.1",
    "-0.1",
    "-0.123",
    "-123.123",
};
final String REG_PATTERN_VALID_DECIMAL_NUMBER = "((?<!\\S)\\d+(?:\\.\\d+)?(?!\\S))|.";
for (String input : inputs) {
    boolean validInput = input.matches(REG_PATTERN_VALID_DECIMAL_NUMBER);
    System.out.println("input: " + input + " ; isValid: " + validInput);
}

输出是:

input: 0 ; isValid: true
input: 0.0 ; isValid: true
input: 0.1 ; isValid: true
input: -0.1 ; isValid: false
input: -0.123 ; isValid: false
input: -123.123 ; isValid: false

所以所有正数都通过了,除了负数。 如何扩展我的正则表达式以接受负数,例如。接受第一个字符“-”?

【问题讨论】:

  • 使用-? 将匹配- 零次或一次,有效地使- 成为可选。

标签: java regex


【解决方案1】:

模式不必那么复杂,试试这个:

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

-? 是匹配有和没有- 符号的部分。 ? 表示出现 1 次或 0 次。

【讨论】:

  • [0-9]\d*\d+有什么区别?
  • @MauricePerry 这里没有区别,但在我的情况下,我最后有 [1-9]|0 以确保不会匹配像 0284 这样的数字,我会修复它。
【解决方案2】:

您不需要现有的正则表达式来匹配正/负小数。您只需要在您的模式之前包含一个-?,以匹配 1 或零“-”。

final String REG_PATTERN_VALID_DECIMAL_NUMBER = "-?\\d+(?:\\.\\d+)?";

【讨论】:

    【解决方案3】:

    如果你在前面加上一个可选的 - 字符,它应该可以工作:

    final String REG_PATTERN_VALID_DECIMAL_NUMBER = "((?<!\\S)-?\\d+(?:\\.\\d+)?(?!\\S))|.";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多