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})";