gpt4 book ai didi

java - 跨所有本地化格式识别所有数字的正则表达式

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:05 25 4
gpt4 key购买 nike

我正在使用 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}+)? 

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

感谢您的帮助。

最佳答案

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

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

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

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

关于java - 跨所有本地化格式识别所有数字的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16156854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com