用于格式化正则表达式匹配的函数

时间:2018-01-11 08:59:04

标签: java regex formatting

我正在编写一个带有3个参数(输入文本,正则表达式匹配,输出格式)的java函数来返回格式化文本。这是我到目前为止所得到的:

输入文字样本1:

6_103319_10_ContractsSummary.csv
6_103319_ContractsSummary.csv

正则表达式匹配:

([0-9]*)_([0-9]*)_([0-9]*)_?ContractsSummary.csv

输出格式:

$1.$2.$3

当前结果

6.103319.10
6.103319.

期望的结果:

6.103319.10
6.103319

输入文字样本2:

Accounts-Summary-123456-20181101.csv
Accounts-Summary-123456.csv

正则表达式匹配:

Accounts-Summary-([0-9]*)-?([0-9]*)?.csv

输出格式:

$1_$2

当前结果

123456_20181101
123456_

期望的结果:

123456_20181101
123456

我遇到的问题是额外的.或' _'当第3个正则表达式组不存在时返回。没有必要总是对某些字符进行替换,输出格式应完全由输出格式参数控制。

这是我目前的功能代码:

Pattern p = Pattern.compile(regexMatch);
Matcher m = p.matcher(inputText);

if (m.find()){
    formattedText=m.replaceFirst(outputFormat);
}

2 个答案:

答案 0 :(得分:0)

取决于您对输出格式的灵活性。对你的例子来说,最容易解决的问题是,之后只删掉尾随点吗?

formttedText=m.replaceFirst(outputFormat).replaceFirst("\\.$", "");

答案 1 :(得分:0)

@Wiktors的替代评论,如果你不想使用regex,你可以遍历字符串并附加数字或点,取决于它是否是下划线(以下字符是数字)。

    for (int i = 0; i < s.length(); i++) {
        if (Character.isDigit(s.charAt(i))) {
            sb.append(s.charAt(i));
        } else if (s.charAt(i) == '_' && Character.isDigit(s.charAt(i + 1))) {
            sb.append(".");
        }
    }

Online example