Java 将两种图案合并为一种
我需要写一个模式来删除货币符号和逗号。例如Java 将两种图案合并为一种,java,regex,Java,Regex,我需要写一个模式来删除货币符号和逗号。例如Fr.-145000.01 之后,模式匹配器应返回-145000.01 我使用的模式是: ^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$ 这将返回-145000.01 String pattern = "^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$"; Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(str);
Fr.-145000.01
之后,模式匹配器应返回-145000.01
我使用的模式是:
^[^0-9\\-]*([0-9\\-\\.\\,]*?)[^0-9\\-]*$
这将返回-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));
}
然后,我删除逗号以获得-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-9][0-9.]+),?
试验
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
最后一个字符串regex=“([+-]?[0-9][0-9.]+),?”;
final String=“Fr.-145000.01\n”
+“Fr.-145000\n”
+“Fr.-145000000\n”
+“Fr.-145\n”
+“Fr.+145000.01\n”
+“Fr.+145000\n”
+“Fr.145000000\n”
+“Fr.145\n”
+“Fr.145000000000.01”;
最终模式=Pattern.compile(regex,Pattern.MULTILINE);
final Matcher Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));
对于(int i=1;i
输出:
-145000.01
它查找最多有3个逗号的数字(最多99999999999.99),并将其替换为数字。我的方法是使用replaceAll
删除所有不必要的部分
显然,不必要的部分是:
字符串开头不是数字或负号的任何序列
逗号
第一个模式由^[^\\d-]+
表示。第二个模式仅仅是,
用|
将它们放在一起:
Pattern p = Pattern.compile("(^[^\\d-]+)|,");
Matcher m = p.matcher(str);
String result = m.replaceAll("");
您可以简单地使用String.replaceAll()
和更简单的正则表达式(前提是您希望输入合理合理,即数字中没有多个小数点或多个负号)
如果你沿着这条路线走下去,我会用BigDecimal
或Double
解析输出,检查它是否正常。你可以捕获两个组,并使用\G
锚来重复匹配,以在上一次匹配结束时确定位置
(?:^[^0-9+-]+(?=[.+,\d-]*\.\d+$)([+-]?\d{1,3})|\G(?!^)),(\d{3})
在爪哇
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
请参阅|考虑使用replaceAll
。replaceAll实际上对我有效
(?:^[^0-9+-]+(?=[.+,\d-]*\.\d+$)([+-]?\d{1,3})|\G(?!^)),(\d{3})
String regex = "(?:^[^0-9+-]+(?=[.+,\\d-]*\\.\\d+$)([+-]?\\d{1,3})|\\G(?!^)),(\\d{3})";