将两个模式合并为一个

时间:2019-06-19 14:50:50

标签: java regex

我需要写一个模式来删除货币符号和逗号。例如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));
}

我希望输出结果可以解决逗号

5 个答案:

答案 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));
    }
}

Demo

答案 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删除所有不必要的部分。

不必要的部分显然是:

  1. 字符串开头不是数字或减号的任何序列。
  2. 逗号

第一个模式由^[^\\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-.]\\.?", "")

如果您沿着这条路线走,我会通过用BigDecimalDouble解析输出来进行检查。

答案 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

相关问题