我正在使用 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
是 ","
\\056
是 "."
我的问题是它不能很好地工作,因为当找到第一部分的模式时,第二部分(在 |
之后)没有被检查,在我的例子中
第一个匹配项将是 200
而不是 200,00
。所以我可以试试这个:
private final String BIG_DECIMAL_PATTERN=\\d+([.,]\\d{3}+)?([,.]\\d{1,2}+)?
但是有一个新问题:逗号和点不排斥,我的意思是如果一个是千位分隔符,小数点应该是另一个。
感谢您的帮助。
最佳答案
我相信您的第二个 RegEx 的变体会适合您。考虑这个正则表达式:
^\\d+(?:([.,])\\d{3})*(?:(?!\\1)[.,]\\d{1,2})?$
现场演示:http://www.rubular.com/r/vHlEdBMhO9
说明:它所做的是首先捕获捕获组#1 中的逗号或点。然后使用负先行确保相同的捕获组#1 不会出现在小数点。换句话说,如果逗号在前,点会在后,反之亦然。
关于java - 跨所有本地化格式识别所有数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156854/