我需要写一个模式来删除货币符号和逗号。例如Fr.-145,000.01
模式匹配器之后应返回-145000.01
。
我正在使用的模式:
^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$
这将返回-145,000.01
然后我删除逗号以获取-145000.01
,我想问一下是否有可能改变模式并直接获取-145000.01
String pattern = "^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(str);
if(m.matches()) {
System.out.println(m.group(1));
}
我希望输出结果可以解决逗号
答案 0 :(得分:1)
一种方法是只在捕获组中收集我们想要的数字.
,+
和-
,然后是可选的逗号,然后将它们加入:
([+-]?[0-9][0-9.]+),?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "([+-]?[0-9][0-9.]+),?";
final String string = "Fr.-145,000.01\n"
+ "Fr.-145,000\n"
+ "Fr.-145,000,000\n"
+ "Fr.-145\n"
+ "Fr.+145,000.01\n"
+ "Fr.+145,000\n"
+ "Fr.145,000,000\n"
+ "Fr.145\n"
+ "Fr.145,000,000,000.01";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
答案 1 :(得分:1)
String str = "Fr.-145,000.01";
Pattern regex = Pattern.compile("^[^0-9-]*(-?[0-9]+)(?:,([0-9]{3}))?(?:,([0-9]{3}))?(?:,([0-9]{3}))?(\\.[0-9]+)?[^0-9-]*$");
Matcher matcher = regex.matcher(str);
System.out.println(matcher.replaceAll("$1$2$3$4$5"));
输出:
-145000.01
它将查找最多3个逗号(最多999,999,999,999.99)的数字,并将其替换为数字。
答案 2 :(得分:1)
我的方法是使用replaceAll
删除所有不必要的部分。
不必要的部分显然是:
第一个模式由^[^\\d-]+
表示。第二个仅仅是,
。
将它们与|
放在一起:
Pattern p = Pattern.compile("(^[^\\d-]+)|,");
Matcher m = p.matcher(str);
String result = m.replaceAll("");
答案 3 :(得分:1)
您可以使用String.replaceAll()
和更简单的正则表达式对其进行简单设置(前提是您期望输入内容合理合理,即数字中不包含多个小数点或多个负号)
String str = "Fr.-145,000.01";
str.replaceAll("[^\\d-.]\\.?", "")
如果您沿着这条路线走,我会通过用BigDecimal
或Double
解析输出来进行检查。
答案 4 :(得分:1)
您可以2个捕获组,并使用\G
锚重复进行匹配,以在上一场比赛结束时声明位置。
(?:^[^0-9+-]+(?=[.+,\d-]*\.\d+$)([+-]?\d{1,3})|\G(?!^)),(\d{3})
在Java中
String regex = "(?:^[^0-9+-]+(?=[.+,\\d-]*\\.\\d+$)([+-]?\\d{1,3})|\\G(?!^)),(\\d{3})";
说明
(?:
非捕获组^[^0-9+-]+
匹配1次以上而不是数字,+
或-
(?=
积极向前看,断言以下内容是:
[.+,\d-]*\.\d+$
匹配0+倍,并声明.
和1+个数字结尾)
积极回望(
捕获组1
[+-]?\d{1,3})
匹配可选的+
或-
,后接1-3位数字|
或\G(?!^)
在前一场比赛的末尾而不是在开始时断言),
关闭捕获组1并匹配,
(\d{3})
在第2组中捕获匹配的3位数字在替换中,使用2个捕获组$1$2
请参见Regex demo | Java demo