正则表达式,用于识别所有本地化格式的所有数字

时间:2013-04-22 21:15:27

标签: java regex

我正在使用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,在第二个之后,依此类推。我声明BIG_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}+)? 

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你能做一个正则表达式吗?例如。类似的东西:

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

注意 - 我还没有检查你的正则表达式是否真的有效 - 并且怀疑这可能不是实现你想要做的事情的最好方法。我所做的一切都是为了让您启动并运行,建议您尝试使用(regex1|regex2),其中regex1为点,后跟逗号,regex2为逗号后跟点。

答案 1 :(得分:1)

我相信您的第二个RegEx的变体将适合您。考虑一下这个正则表达式:

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

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

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