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

标签 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}+)? 

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

感谢您的帮助。

最佳答案

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

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

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

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

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

相关文章:

Java Regex 计算并删除行首的空格?

regex - 我可以在Elasticsearch中的停止分析器的停用词中指定regexp吗?

java - 如何在Android中使用Java设置可编辑的EditText?

java - 我需要使用 JDBC 语句更新 mySQL 中的记录

java - 可以 http ://localhost:8080/tunnel-web/jsonws be opened on default installation?

c# - 使用带分隔符的字符串的正则表达式部分更新

iphone - RegexKitLite 不匹配方括号

regex - Notepad++ 显式量词符号

java - 为什么插入 ArrayList 后行会重复?

Java - 获取给定源和 mime 类型的图像文件扩展名