我正在编写一个带有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);
}
答案 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(".");
}
}