我正在使用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
以匹配任何情况。
以下是我定义的规则:
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}+)?
但是有一个新问题:逗号和点不是独占的,我的意思是如果一个是千位分隔符,小数点应该是另一个。
感谢您的帮助。
答案 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})?$
说明:它的作用是首先捕获捕获组#1中的逗号或点。然后确保相同的捕获组#1不会出现在使用负前瞻的小数点。换句话说,如果逗号首先出现,那么dot将在稍后出现,反之亦然。