非常感谢你的帮助。
优雅的正则表达式检查字符串是否包含数字?有什么建议?感谢。
答案 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本身,毕竟定义总是正确的,而使用正则表达式总是正确的,你可能只是错了。