Reg~x表示N~数

时间:2010-10-29 05:53:52

标签: java string

非常感谢你的帮助。

优雅的正则表达式检查字符串是否包含数字?有什么建议?感谢。

3 个答案:

答案 0 :(得分:9)

我不认为异常(即使它被触发)比正则表达式贵得多 - 你必须对它进行分析,看看它是否真的有所作为。

那就是说,根据Java Docs实现BigDecimal语法的正则表达式是

[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?

说明:

[+-]?       # optional sign
(?:         # required significand: either...
 \d+        # a number
 (?:\.\d*)? # optionally followed by a dot, optionally followed by more digits
 |          # or...
 \.\d+      # just a dot, followed by digits (in this case required)
)           # end of significand
(?:         # optional exponent
 [eE]       # required exponent indicator
 [+-]?      # optional sign
 \d+        # required digits
)?          # end of exponent

如果您想允许不同的数字格式(以及数千个分隔符),您可以先从DecimalFormatSymbols获取这些值并使用它构建正则表达式。

像这样(我不懂Java,所以随意纠正我的语法错误):

// you need java.util.regex.Pattern and java.text.DecimalFormatSymbols
string ds = Pattern.quote(DecimalFormatSymbols.getDecimalSeparator())
string gs = Pattern.quote(DecimalFormatSymbols.getGroupingSeparator())
string ms = Pattern.quote(DecimalFormatSymbols.getMinusSign())
string es = Pattern.quote(DecimalFormatSymbols.getExponentSeparator())

string myre = 
    "(?xi)\n       # verbose, case-insensitive regex" +
    "[+" +ms+ "]?  # optional sign\n" +
    "(?:           # required significand: either...\n" +
    " (?:\\d{1,3}(?:" +gs+ "\\d{3}|\\d++) # a number with optional thousand separators,\n" +
    " (?:" +ds+ "\\d*)? # optionally followed by a dot, optionally followed by more digits\n" +
    " |            # or...\n" +
      ds+ "\\d+    # just a dot, followed by digits (in this case required)\n" +
    ")             # end of significand\n" +
    "(?:           # optional exponent\n" +
      es+ "        # required exponent indicator\n" +
    " [+" +ms+ "]? # optional sign\n" +
    " \\d+         # required digits\n" +
    ")?            # end of exponent"

boolean foundMatch = subjectString.matches(myregex);

然后,在将数字转换为BigDecimal转换之前,您可以将依赖于区域设置的位替换回其美国对应位,如果这不是区域设置感知的。

答案 1 :(得分:3)

看一下Apache的NumberUtils.isNumber的实现。我不建议使用正则表达式进行此类验证。

答案 2 :(得分:2)

不要使用正则表达式,它们几乎总是不是任何问题的答案。您可能会接受一些正则表达式,然后再发现它并不涵盖所有情况。如果你真的想知道一个字符串是否有BigDecimal,为什么不问源BigDecimal本身,毕竟定义总是正确的,而使用正则表达式总是正确的,你可能只是错了。