数字正则表达式中的重叠测试



我在这里有一个超出我的正则表达式范围的挑战。如果有人有建议,将不胜感激。我一直无法追踪到这样的事情,我不确定它是否可行。我在 java 中使用以下表达式:

"(?i)-?(([1-9]+[0-9]*)|0)(\.[0-9]*[1-9]+)?(e-?[0-9]+)?"

验证长字符串(最多 255 个字符),以确认它们至少符合允许的数值(不一定用于任何类型的计算)并允许使用科学记数法选项。BigDecimal 类没有完成我需要的一切,因此对小数部分中的前导零和尾随零进行了额外的检查,因为该值必须符合数字的最简化表示形式,并遵循可预测的协议而无需进行任何更改。以下所有内容都返回了我期望的结果:

String allowance = "(?i)-?(([1-9]+[0-9]*)|0)(\.[0-9]*[1-9]+)?(e-?[0-9]+)?" ;
System.out.println("0".matches(allowance)) ;   // assert true. Confirm default
System.out.println("-42".matches(allowance)) ;   // assert true. Confirm integers only
System.out.println("0.2e543".matches(allowance)) ;   // assert true
System.out.println("1e543".matches(allowance)) ;   // assert true
System.out.println("0.2000e543".matches(allowance)) ;   // assert false : trailing zeros after fractional .2
System.out.println(".2e543".matches(allowance)) ;   // assert false : missing the leading zero
System.out.println("e543".matches(allowance)) ;   // assert false : malformed
System.out.println("0001e543".matches(allowance)) ;   // assert false : leading zeros in the integer
System.out.println("1.0".matches(allowance)) ;   // assert false : easiest match is "1"
System.out.println("0.0".matches(allowance)) ;   // assert false : easiest match is "0"

所有这些都很好,很好,但我无法用同一个表达方式弄清楚这两个。也许一个或另一个,但不是两个:

System.out.println("-0".matches(allowance)) ;   // Supposed to be FALSE - Should just be "0"
System.out.println("0e543".matches(allowance)) ;   // Supposed to be FALSE - "0" integer rules out the exponent segment so the easiest match would be "0"

是否可以捕获段"-?(([1-9]+[0-9])|0)(\.[0-9][1-9]+)?" 作为两个独立但重叠的测试:1) 排除"-0",但前提是该值没有分数值(即允许 -0.5),然后跳到 2) 如果整数值在测试中返回为"0",则排除下一个跟随"e543"指数?

你可以试试这个:

"(?i)(0|-?([1-9][0-9]*)(\.[0-9]*[1-9])?(e-?[1-9][0-9]*)?|-?0\.[0-9]*[1-9](e-?[1-9][0-9]*)?)"

基本上,您接受以下任何一项:

  • 零,不带符号、小数或指数
  • 带有可选符号、小数或指数的非零数
  • 带有必需小数和可选符号或指数的零

这是一个演示。

您是否考虑过在第一个测试中使用 lookahead,而不是在第二个测试中消耗您想要检查的那些?

http://www.regular-expressions.info/lookaround.html

最新更新