Java 用于提取所有可能金额的正则表达式
我正在寻找一个正则表达式,它将从字符串中提取所有可能的金额,假设金额始终包含2个小数,并接受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 使用正则表达式可以实现这一点吗 我当前的正则表达式是?
或,
作为分隔符。例如,对于以下字符串,我希望找到以下金额:
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}))
确保以下匹配
将以下内容捕获到捕获组1中。这将捕获较短的变体,如(\d+[,]\d{2})
。1.23
匹配一个或多个数字\d+
按字面意思匹配[,]
或,
正好匹配两位数字\d{2}
(?=((?:\d+[,]){2,}?\d{2})?
确保以下匹配
可以选择将以下内容捕获到捕获组2中。这将捕获中间的数字,如((?:\d+[,]){2,}?\d{2})
,其中较小的版本和较长的版本分别位于同一位置(1.234,56
和1.23
)。如果可以使用更长的版本,您可能需要添加更多与此相同的正面外观,并将下一节中的1.234567.89
更改为{2,}
,{3,}
等,然后将这些组添加到{4,}
循环中。如果不存在中间编号,它将简单地捕获与第三个前瞻相同的编号(重复的编号将在代码中删除)。while
匹配以下2次或更多次,但尽可能少。(?:\d+[,]){2,}?
匹配一个或多个数字\d+
按字面意思匹配[,]
或,
正好匹配两位数字\d{2}
(?=((?:\d+[,])+\d{2}))
确保以下匹配
将以下内容捕获到捕获组3中。这将捕获较长的变体,如((?:\d+[,])+\d{2})
。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]