4

我正在使用 Scanner 对象扫描文本,比如说lineScanner. 以下是声明:

String myText= "200,00/100,00/28/65.36/21/458,696/25.125/4.23/6.3/4,2/659845/4524/456,65/45/23.495.254,3";
Scanner lineScanner = new Scanner(myText);

有了这个Scanner,我想找到第一个BigDecimal,然后找到第二个,依此类推。我宣布 aBIG_DECIMAL_PATTERN匹配任何情况。

以下是我定义的规则:

  • 千位分隔符后始终紧跟 3 位数字
  • 小数点后总是正好有 1 或 2 位数字。
  • 如果千位分隔符是逗号符号,那么小数点是点符号,反之亦然
  • 千位分隔符是可选的,作为数字的小数部分

String nextBigDecimal = lineScanner.findInLine(BIG_DECIMAL_PATTERN);

现在,这是BIG_DECIMAL_PATTERN我声明的:

private final String BIG_DECIMAL_PATTERN=
      "\\d+(\\054\\d{3}+)?(\\056\\d{1,2}+)?|\\d+(\\056\\d{3}+)?(\\054\\d{1,2}+)?)";

\\054是 ASCII 八进制表示","

\\056是 ASCII 八进制表示"."

我的问题是它不能很好地工作,因为当第一部分的模式被发现时,第二部分(在 之后|)没有被检查,在我的例子中,第一个匹配将是200而不是200,00。所以我可以试试这个:

private final String BIG_DECIMAL_PATTERN=\\d+([.,]\\d{3}+)?([,.]\\d{1,2}+)? 

但是有一个新的问题:逗号和点不是互斥的,我的意思是如果一个是千位分隔符,小数点应该是另一个。

感谢您的帮助。

4

2 回答 2

1

你能做一个非此即彼的正则表达式吗?例如:

private final String BIG_DECIMAL_PATTERN
    = "\\d+((\\.\\d{3}+)?(,\\d{1,2}+)?|(,\\d{3}+)?(\\.\\d{1,2}+)?)"

注意 - 我没有检查你的正则表达式是否真的有效 - 并且怀疑这可能不是实现你想要做的事情的最佳方式。我在这里所做的一切都是为了让您启动并运行,建议您可以尝试使用(regex1|regex2)where regex1is dots after commas 和regex2is commas after dots。

于 2013-04-23T13:30:28.943 回答
1

我相信您的第二个 RegEx 的变体会为您工作。考虑这个正则表达式:

^\\d+(?:([.,])\\d{3})*(?:(?!\\1)[.,]\\d{1,2})?$

现场演示:http ://www.rubular.com/r/vHlEdBMhO9

说明:它的作用是首先捕获捕获组#1 中的逗号或点。然后使用负前瞻确保相同的捕获组#1 不会出现在小数点处。换句话说,这确保了如果逗号先出现,那么点将在后出现,反之亦然。

于 2013-04-23T14:27:01.100 回答