Java 用于提取所有可能金额的正则表达式

Java 用于提取所有可能金额的正则表达式,java,regex,Java,Regex,我正在寻找一个正则表达式,它将从字符串中提取所有可能的金额,假设金额始终包含2个小数,并接受或,作为分隔符。例如,对于以下字符串,我希望找到以下金额: 1.234,567.89 1.23 1.234,56 234,56 34,56 4,56 1.234,567.89 234,567.89 34,567.89 4,567.89 567.89 67.89 7.89 使用正则表达式可以实现这一点吗 我当前的正则表达式是?

我正在寻找一个正则表达式,它将从字符串中提取所有可能的金额,假设金额始终包含2个小数,并接受
作为分隔符。例如,对于以下字符串,我希望找到以下金额:

1.234,567.89

1.23
1.234,56
  234,56
   34,56
    4,56
1.234,567.89
  234,567.89
   34,567.89
    4,567.89
      567.89
       67.89
        7.89
使用正则表达式可以实现这一点吗


我当前的正则表达式是
?\\d{1,3}([\\,]\\d{3})*([\\,]\\d{2})
,但这显然不起作用,因为它只返回1个匹配项。

所以,起初,我认为这不能用正则表达式实现。我的假设是错误的,但这只能通过删除重复项和空字符串/空值来实现

正则表达式

上面的模式包含3个正面外观。详情如下:

  • (?=(\d+[,]\d{2}))
    确保以下匹配
    • (\d+[,]\d{2})
      将以下内容捕获到捕获组1中。这将捕获较短的变体,如
      1.23
      • \d+
        匹配一个或多个数字
      • [,]
        按字面意思匹配
      • \d{2}
        正好匹配两位数字
  • (?=((?:\d+[,]){2,}?\d{2})?
    确保以下匹配
    • ((?:\d+[,]){2,}?\d{2})
      可以选择将以下内容捕获到捕获组2中。这将捕获中间的数字,如
      1.234,56
      ,其中较小的版本和较长的版本分别位于同一位置(
      1.23
      1.234567.89
      )。如果可以使用更长的版本,您可能需要添加更多与此相同的正面外观,并将下一节中的
      {2,}
      更改为
      {3,}
      {4,}
      等,然后将这些组添加到
      while
      循环中。如果不存在中间编号,它将简单地捕获与第三个前瞻相同的编号(重复的编号将在代码中删除)。
      • (?:\d+[,]){2,}?
        匹配以下2次或更多次,但尽可能少。
        • \d+
          匹配一个或多个数字
        • [,]
          按字面意思匹配
      • \d{2}
        正好匹配两位数字
  • (?=((?:\d+[,])+\d{2}))
    确保以下匹配
    • ((?:\d+[,])+\d{2})
      将以下内容捕获到捕获组3中。这将捕获较长的变体,如
      1.234567.89
      • (?:\d+[,])+
        匹配以下一次或多次
        • \d+
          匹配一个或多个数字
        • [,]
          按字面意思匹配
      • \d{2}
        正好匹配两位数字
  • 代码 下面的代码只是迭代所有匹配项并提取组值,然后将它们添加到
    列表中<然后使用找到的方法从列表中删除code>null
    值。然后将列表转换为
    集合
    ,以根据删除重复项并添加回(现在为空)列表


    一旦一个角色出现在一场比赛中,它就不能在另一场比赛中重复使用。只是好奇,它的目的是什么?@4卡斯特不完全是真的,它可以,尽管我同意,但在这种情况下并不令人惊讶。等待解释:)确实令人惊讶:D Thx
    (?=(\d+[.,]\d{2}))(?=((?:\d+[.,]){2,}?\d{2})?)(?=((?:\d+[.,])+\d{2}))
    
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    class Main{
        public static void main(String[] args) {
            String s = "1.234,567.89";
            Pattern p = Pattern.compile("(?=(\\d+[.,]\\d{2}))(?=((?:\\d+[.,]){2,}?\\d{2})?)(?=((?:\\d+[.,])+\\d{2}))");
            Matcher m = p.matcher(s);
    
            List<String> al = new ArrayList<>();
            Set<String> hs = new HashSet<>();
    
            while(m.find()) {
                al.add(m.group(1));
                al.add(m.group(2));
                al.add(m.group(3));
            }
    
            al.removeAll(Collections.singleton(null));
            hs.addAll(al);
            al.clear();
            al.addAll(hs);
    
            System.out.println(al);
        }
    }
    
    [34,567.89, 4,56, 7.89, 234,56, 4,567.89, 1.234,56, 1.23, 1.234,567.89, 34,56, 567.89, 67.89, 234,567.89]